aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/utils.c')
-rw-r--r--drivers/acpi/utils.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c
index 552248b0005b..6d408bfbbb1d 100644
--- a/drivers/acpi/utils.c
+++ b/drivers/acpi/utils.c
@@ -121,7 +121,7 @@ acpi_extract_package(union acpi_object *package,
121 break; 121 break;
122 default: 122 default:
123 printk(KERN_WARNING PREFIX "Invalid package element" 123 printk(KERN_WARNING PREFIX "Invalid package element"
124 " [%d]: got number, expecing" 124 " [%d]: got number, expecting"
125 " [%c]\n", 125 " [%c]\n",
126 i, format_string[i]); 126 i, format_string[i]);
127 return AE_BAD_DATA; 127 return AE_BAD_DATA;
@@ -148,7 +148,7 @@ acpi_extract_package(union acpi_object *package,
148 default: 148 default:
149 printk(KERN_WARNING PREFIX "Invalid package element" 149 printk(KERN_WARNING PREFIX "Invalid package element"
150 " [%d] got string/buffer," 150 " [%d] got string/buffer,"
151 " expecing [%c]\n", 151 " expecting [%c]\n",
152 i, format_string[i]); 152 i, format_string[i]);
153 return AE_BAD_DATA; 153 return AE_BAD_DATA;
154 break; 154 break;
@@ -169,11 +169,20 @@ acpi_extract_package(union acpi_object *package,
169 /* 169 /*
170 * Validate output buffer. 170 * Validate output buffer.
171 */ 171 */
172 if (buffer->length < size_required) { 172 if (buffer->length == ACPI_ALLOCATE_BUFFER) {
173 buffer->pointer = ACPI_ALLOCATE(size_required);
174 if (!buffer->pointer)
175 return AE_NO_MEMORY;
173 buffer->length = size_required; 176 buffer->length = size_required;
174 return AE_BUFFER_OVERFLOW; 177 memset(buffer->pointer, 0, size_required);
175 } else if (buffer->length != size_required || !buffer->pointer) { 178 } else {
176 return AE_BAD_PARAMETER; 179 if (buffer->length < size_required) {
180 buffer->length = size_required;
181 return AE_BUFFER_OVERFLOW;
182 } else if (buffer->length != size_required ||
183 !buffer->pointer) {
184 return AE_BAD_PARAMETER;
185 }
177 } 186 }
178 187
179 head = buffer->pointer; 188 head = buffer->pointer;