--- trunk/grubby/grubby.c 2020/07/07 11:12:00 3139 +++ trunk/grubby/grubby.c 2020/07/07 11:29:06 3154 @@ -482,20 +482,28 @@ snprintf(result, resultMaxSize, "%s", ++current); i++; + int result_len = 0; for (; i < line->numElements; ++i) { current = line->elements[i].item; current_len = strlen(current); current_indent = line->elements[i].indent; current_indent_len = strlen(current_indent); - strncat(result, current_indent, current_indent_len); + memcpy(result + result_len, current_indent, current_indent_len); + result_len += current_indent_len; + if (current[current_len - 1] != quote_char) { - strncat(result, current, current_len); + memcpy(result + result_len, current_indent, + current_indent_len); + result_len += current_len; } else { - strncat(result, current, current_len - 1); + memcpy(result + result_len, current_indent, + current_indent_len); + result_len += (current_len - 1); break; } } + result[result_len] = '\0'; return result; } @@ -1440,6 +1448,7 @@ extras = malloc(len + 1); *extras = '\0'; + int buf_len = 0; /* get title. */ for (int i = 0; i < line->numElements; i++) { if (!strcmp @@ -1456,13 +1465,18 @@ len = strlen(title); if (title[len - 1] == quote_char) { - strncat(buf, title, len - 1); + memcpy(buf + buf_len, title, len - 1); + buf_len += (len - 1); break; } else { - strcat(buf, title); - strcat(buf, line->elements[i].indent); + memcpy(buf + buf_len, title, len); + buf_len += len; + len = strlen(line->elements[i].indent); + memcpy(buf + buf_len, line->elements[i].indent, len); + buf_len += len; } } + buf[buf_len] = '\0'; /* get extras */ int count = 0; @@ -3195,7 +3209,7 @@ int suseGrubConfGetBoot(const char *path, char **bootPtr) { - char *grubDevice; + char *grubDevice = NULL; if (suseGrubConfGetInstallDevice(path, &grubDevice)) dbgPrintf("error looking for grub installation device\n"); @@ -3750,9 +3764,9 @@ if (!chptra && !chptrb) return 0; - else if (!chptra) + else if (!chptra && chptrb) return *chptrb - 0; - else if (!chptrb) + else if (!chptrb && chptra) return 0 - *chptra; else return strcmp(chptra, chptrb); @@ -5206,15 +5220,26 @@ int i = 0; for (int j = 1; j < argc; j++) i += strlen(argv[j]) + 1; - saved_command_line = malloc(i); - if (!saved_command_line) { - fprintf(stderr, "grubby: %m\n"); - exit(1); - } - saved_command_line[0] = '\0'; - for (int j = 1; j < argc; j++) { - strcat(saved_command_line, argv[j]); - strncat(saved_command_line, j == argc - 1 ? "" : " ", 1); + + if (i > 0) { + saved_command_line = malloc(i); + if (!saved_command_line) { + fprintf(stderr, "grubby: %m\n"); + exit(1); + } + + saved_command_line[0] = '\0'; + int cmdline_len = 0, arg_len; + for (int j = 1; j < argc; j++) { + arg_len = strlen(argv[j]); + memcpy(saved_command_line + cmdline_len, argv[j], arg_len); + cmdline_len += arg_len; + if (j != argc - 1) { + memcpy(saved_command_line + cmdline_len, " ", 1); + cmdline_len++; + } + } + saved_command_line[cmdline_len] = '\0'; } optCon = poptGetContext("grubby", argc, argv, options, 0); @@ -5512,8 +5537,9 @@ entry = findEntryByIndex(config, config->defaultImage); if (!entry) return 0; - if (!suitableImage(entry, bootPrefix, 0, flags)) - return 0; + + /* check if is a suitable image but still print it */ + suitableImage(entry, bootPrefix, 0, flags); line = getLineByType(LT_KERNEL | LT_HYPER | LT_KERNEL_EFI |