← Commit list

ea01f254b

Ron Yorston
Ron Yorston
2026-03-05
SUCCESS Duration: 142s

Subject

paste: fix output when file lengths differ

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
gcc -Wp,-MD,applets/.usage.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer      -Iinclude -Iinclude -o applets/usage applets/usage.c

Build Log

(log yok)

Commit Diff GitHub →

coreutils/paste.c+24 -12
@@ -34,27 +34,38 @@
static void paste_files(FILE** files, int file_cnt, char* delims, int del_cnt)
{
- char *line;
+ char **line = xmalloc(file_cnt * sizeof(char *));
char delim;
int active_files = file_cnt;
int i;
while (active_files > 0) {
int del_idx = 0;
+ int got_line = FALSE;
for (i = 0; i < file_cnt; ++i) {
- if (files[i] == NULL)
- continue;
-
- line = xmalloc_fgetline(files[i]);
- if (!line) {
- fclose_if_not_stdin(files[i]);
- files[i] = NULL;
- --active_files;
- continue;
+ if (files[i]) {
+ line[i] = xmalloc_fgetline(files[i]);
+ if (!line[i]) {
+ fclose_if_not_stdin(files[i]);
+ files[i] = NULL;
+ --active_files;
+ } else {
+ got_line = TRUE;
+ }
+ } else {
+ line[i] = NULL;
+ }
+ }
+
+ if (!got_line)
+ break;
+
+ for (i = 0; i < file_cnt; ++i) {
+ if (line[i]) {
+ fputs_stdout(line[i]);
+ free(line[i]);
}
- fputs_stdout(line);
- free(line);
delim = '\n';
if (i != file_cnt - 1) {
delim = delims[del_idx++];
@@ -65,6 +76,7 @@ static void paste_files(FILE** files, int file_cnt, char* delims, int del_cnt)
fputc(delim, stdout);
}
}
+ free(line);
}
static void paste_files_separate(FILE** files, char* delims, int del_cnt)
testsuite/paste/paste-long-short+19 -0
@@ -0,0 +1,19 @@
+cat > foo <<EOF
+foo1
+foo2
+foo3
+EOF
+
+cat > bar <<EOF
+bar1
+bar2
+EOF
+
+cat > baz <<EOF
+foo1 bar1
+foo2 bar2
+foo3
+EOF
+
+busybox paste foo bar > qux
+diff -u baz qux
testsuite/paste/paste-short-long+19 -0
@@ -0,0 +1,19 @@
+cat > foo <<EOF
+foo1
+foo2
+EOF
+
+cat > bar <<EOF
+bar1
+bar2
+bar3
+EOF
+
+cat > baz <<EOF
+foo1 bar1
+foo2 bar2
+ bar3
+EOF
+
+busybox paste foo bar > qux
+diff -u baz qux