← Commit list

43a9d7d31

Denys Vlasenko
Denys Vlasenko
2026-09-21
SUCCESS Duration: 203s

Subject

dpkg: reformat code in read_package_field(), exposing why it's buggy

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

archival/dpkg.c+22 -34
@@ -548,20 +548,13 @@ static int read_package_field(const char *package_buffer, char **field_name, cha
int next_offset;
int name_length;
int value_length;
- int exit_flag = FALSE;
*field_name = NULL;
*field_value = NULL;
- if (package_buffer == NULL) {
- return -1;
- }
while (1) {
next_offset = offset + 1;
switch (package_buffer[offset]) {
- case '\0':
- exit_flag = TRUE;
- break;
case ':':
if (offset_name_end == 0) {
offset_name_end = offset;
@@ -572,8 +565,7 @@ static int read_package_field(const char *package_buffer, char **field_name, cha
break;
case '\n':
if (package_buffer[next_offset] != ' ') {
- exit_flag = TRUE;
- break;
+ goto end_of_value;
}
/* fall through */
case '\t':
@@ -586,35 +578,31 @@ static int read_package_field(const char *package_buffer, char **field_name, cha
offset_value_start++;
}
break;
- }
- if (exit_flag) {
- /* Check that the names are valid */
- name_length = offset_name_end - offset_name_start;
- value_length = offset - offset_value_start;
- if (name_length == 0) {
- break;
- }
- if ((name_length > 0) && (value_length > 0)) {
+ case '\0':
+ end_of_value:
+ /* Check that the names are valid */
+ name_length = offset_name_end - offset_name_start;
+ value_length = offset - offset_value_start;
+ if ((name_length > 0) && (value_length > 0)) {
+ if (name_length > 0) {
+ *field_name = xstrndup(&package_buffer[offset_name_start], name_length);
+ }
+ if (value_length > 0) {
+ *field_value = xstrndup(&package_buffer[offset_value_start], value_length);
+ }
+ return next_offset;
+ }
+ if (!package_buffer[offset])
+ return next_offset; //BUG! past NUL
+ /* Not valid: start fresh with next field */
+ offset_name_start = offset + 1;
+ offset_name_end = 0;
+ offset_value_start = offset + 1;
+ offset++; //BUG?
break;
- }
-
- /* Not valid: start fresh with next field */
- exit_flag = FALSE;
- offset_name_start = offset + 1;
- offset_name_end = 0;
- offset_value_start = offset + 1;
- offset++;
}
offset++;
} /* while (1) */
-
- if (name_length > 0) {
- *field_name = xstrndup(&package_buffer[offset_name_start], name_length);
- }
- if (value_length > 0) {
- *field_value = xstrndup(&package_buffer[offset_value_start], value_length);
- }
- return next_offset;
}
/* The parameter is NUL-terminated */