Annotation of /trunk/coreutils/patches-5.3.0/coreutils-5.3.0-pathname-off-by-one.patch
Parent Directory | Revision Log
Revision 44 -
(hide annotations)
(download)
Thu Oct 13 21:17:16 2005 UTC (18 years, 11 months ago) by niro
File size: 3093 byte(s)
Thu Oct 13 21:17:16 2005 UTC (18 years, 11 months ago) by niro
File size: 3093 byte(s)
patch set for coretutils-5.3.0
1 | niro | 44 | http://bugs.gentoo.org/105639 |
2 | |||
3 | 2005-01-25 Jim Meyering <jim@meyering.net> | ||
4 | |||
5 | * path-concat.c: Don't include assert.h. | ||
6 | (path_concat): Remove assertion that would have triggered | ||
7 | for ABASE starting with more than one slash. | ||
8 | Reported by Andreas Schwab. | ||
9 | |||
10 | * path-concat.c (path_concat): Set *BASE_IN_RESULT | ||
11 | properly when ABASE is an absolute file name. | ||
12 | Correct the description of this function. | ||
13 | Include <assert.h>. | ||
14 | Add an assertion and a test driver. | ||
15 | This fixes a bug introduced on 2004-07-02. | ||
16 | Andreas Schwab reported the resulting failure of cp --parents: | ||
17 | http://lists.gnu.org/archive/html/bug-coreutils/2005-01/msg00130.html | ||
18 | |||
19 | Index: path-concat.c | ||
20 | =================================================================== | ||
21 | RCS file: /cvsroot/coreutils/coreutils/lib/Attic/path-concat.c,v | ||
22 | retrieving revision 1.21 | ||
23 | retrieving revision 1.23 | ||
24 | diff -u -p -r1.21 -r1.23 | ||
25 | --- lib/path-concat.c 5 Jul 2004 08:41:13 -0000 1.21 | ||
26 | +++ lib/path-concat.c 25 Jan 2005 12:30:01 -0000 1.23 | ||
27 | @@ -1,6 +1,6 @@ | ||
28 | /* path-concat.c -- concatenate two arbitrary pathnames | ||
29 | |||
30 | - Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free | ||
31 | + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free | ||
32 | Software Foundation, Inc. | ||
33 | |||
34 | This program is free software; you can redistribute it and/or modify | ||
35 | @@ -54,8 +54,10 @@ longest_relative_suffix (char const *f) | ||
36 | Arrange for a directory separator if necessary between DIR and BASE | ||
37 | in the result, removing any redundant separators. | ||
38 | In any case, if BASE_IN_RESULT is non-NULL, set | ||
39 | - *BASE_IN_RESULT to point to the copy of BASE in the returned | ||
40 | - concatenation. | ||
41 | + *BASE_IN_RESULT to point to the copy of ABASE in the returned | ||
42 | + concatenation. However, if ABASE begins with more than one slash, | ||
43 | + set *BASE_IN_RESULT to point to the sole corresponding slash that | ||
44 | + is copied into the result buffer. | ||
45 | |||
46 | Report an error if memory is exhausted. */ | ||
47 | |||
48 | @@ -78,10 +80,47 @@ path_concat (char const *dir, char const | ||
49 | p += needs_separator; | ||
50 | |||
51 | if (base_in_result) | ||
52 | - *base_in_result = p; | ||
53 | + *base_in_result = p - IS_ABSOLUTE_FILE_NAME (abase); | ||
54 | |||
55 | p = mempcpy (p, base, baselen); | ||
56 | *p = '\0'; | ||
57 | |||
58 | return p_concat; | ||
59 | } | ||
60 | + | ||
61 | +#ifdef TEST_PATH_CONCAT | ||
62 | +#include <stdlib.h> | ||
63 | +#include <stdio.h> | ||
64 | +int | ||
65 | +main () | ||
66 | +{ | ||
67 | + static char const *const tests[][3] = | ||
68 | + { | ||
69 | + {"a", "b", "a/b"}, | ||
70 | + {"a/", "b", "a/b"}, | ||
71 | + {"a/", "/b", "a/b"}, | ||
72 | + {"a", "/b", "a/b"}, | ||
73 | + | ||
74 | + {"/", "b", "/b"}, | ||
75 | + {"/", "/b", "/b"}, | ||
76 | + {"/", "/", "/"}, | ||
77 | + {"a", "/", "a/"}, /* this might deserve a diagnostic */ | ||
78 | + {"/a", "/", "/a/"}, /* this might deserve a diagnostic */ | ||
79 | + {"a", "//b", "a/b"}, | ||
80 | + }; | ||
81 | + size_t i; | ||
82 | + bool fail = false; | ||
83 | + for (i = 0; i < sizeof tests / sizeof tests[0]; i++) | ||
84 | + { | ||
85 | + char *base_in_result; | ||
86 | + char const *const *t = tests[i]; | ||
87 | + char *res = path_concat (t[0], t[1], &base_in_result); | ||
88 | + if (strcmp (res, t[2]) != 0) | ||
89 | + { | ||
90 | + printf ("got %s, expected %s\n", res, t[2]); | ||
91 | + fail = true; | ||
92 | + } | ||
93 | + } | ||
94 | + exit (fail ? EXIT_FAILURE : EXIT_SUCCESS); | ||
95 | +} | ||
96 | +#endif |