diff options
Diffstat (limited to 'drivers/acpi/utils.c')
-rw-r--r-- | drivers/acpi/utils.c | 21 |
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; |