Fix off-by-one bug in path_concat()
- Resolves: rhbz#799347 - path_utils:test_path_concat_neg fails on 64-bit big
                          endians
			
			
This commit is contained in:
		
							parent
							
								
									2bad917ce3
								
							
						
					
					
						commit
						82d0379be9
					
				
							
								
								
									
										62
									
								
								0001-path_utils-handle-off-by-one-error-in-path_concat.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								0001-path_utils-handle-off-by-one-error-in-path_concat.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,62 @@ | ||||
| From 6bc68b4dfeaf3320adc58e52dea5530ce2ce8a6c Mon Sep 17 00:00:00 2001 | ||||
| From: Stephen Gallagher <sgallagh@redhat.com> | ||||
| Date: Tue, 6 Mar 2012 11:05:53 -0500 | ||||
| Subject: [PATCH 1/2] path_utils: handle off-by-one error in path_concat() | ||||
| 
 | ||||
| https://fedorahosted.org/sssd/ticket/1230 | ||||
| ---
 | ||||
|  path_utils/path_utils.c    |    2 +- | ||||
|  path_utils/path_utils_ut.c |   18 ++++++++++++++---- | ||||
|  2 files changed, 15 insertions(+), 5 deletions(-) | ||||
| 
 | ||||
| diff --git a/path_utils/path_utils.c b/path_utils/path_utils.c
 | ||||
| index 97c845c70f41e071c0d9524172ad3b0b33a84c3b..360d49943436681970691cc829c8039f3a0e8a5f 100644
 | ||||
| --- a/path_utils/path_utils.c
 | ||||
| +++ b/path_utils/path_utils.c
 | ||||
| @@ -210,7 +210,7 @@ int path_concat(char *path, size_t path_size, const char *head, const char *tail
 | ||||
|          for (p = tail; *p && *p == '/'; p++);   /* skip any leading slashes in tail */ | ||||
|          if (dst > path) | ||||
|              if (dst < dst_end) *dst++ = '/';    /* insert single slash between head & tail */ | ||||
| -        for (src = p; *src && dst <= dst_end;) *dst++ = *src++; /* copy tail */
 | ||||
| +        for (src = p; *src && dst < dst_end;) *dst++ = *src++; /* copy tail */
 | ||||
|          if (*src) return ENOBUFS; /* failed to copy everything */ | ||||
|      } | ||||
|      *dst = 0; | ||||
| diff --git a/path_utils/path_utils_ut.c b/path_utils/path_utils_ut.c
 | ||||
| index 044e9ea2d12e396f9f68a23bde8b11f6ac3fcc09..fbefcab1eb66b5c36a3d7a74a099f569ea764b3b 100644
 | ||||
| --- a/path_utils/path_utils_ut.c
 | ||||
| +++ b/path_utils/path_utils_ut.c
 | ||||
| @@ -241,16 +241,26 @@ END_TEST
 | ||||
|  START_TEST(test_path_concat_neg) | ||||
|  { | ||||
|      char small[3]; | ||||
| -    char small2[4];
 | ||||
| -    char p2[8];
 | ||||
| +    char small2[5];
 | ||||
| +    char small3[7];
 | ||||
| +    char p2[9];
 | ||||
|   | ||||
|      /* these two test different conditions */ | ||||
| +
 | ||||
| +    /* Test if head is longer than the buffer */
 | ||||
|      fail_unless(path_concat(small, 3, "/foo", "bar") == ENOBUFS); | ||||
| -    fail_unless(path_concat(small2, 4, "/foo", "bar") == ENOBUFS);
 | ||||
| +
 | ||||
| +    /* Test if head is the same length as the buffer */
 | ||||
| +    fail_unless(path_concat(small2, 5, "/foo", "bar") == ENOBUFS);
 | ||||
| +
 | ||||
| +    /* Test if head+tail is the longer than the buffer */
 | ||||
| +    fail_unless(path_concat(small3, 7, "/foo", "bar") == ENOBUFS);
 | ||||
|   | ||||
|      /* off-by-one */ | ||||
| +    p2[8] = 1; /* Check whether we've written too far */
 | ||||
|      fail_unless(path_concat(p2, 8, "/foo", "bar") == ENOBUFS); | ||||
| -    fail_unless_str_equal(p2, "/foo/bar");
 | ||||
| +    fail_unless(p2[8] == 1); /* This should be untouched */
 | ||||
| +    fail_unless_str_equal(p2, "/foo/ba");
 | ||||
|  } | ||||
|  END_TEST | ||||
|   | ||||
| -- 
 | ||||
| 1.7.7.6 | ||||
| 
 | ||||
							
								
								
									
										62
									
								
								0002-path_utils-Handle-in-path_concat.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								0002-path_utils-Handle-in-path_concat.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,62 @@ | ||||
| From 641d6b290b49dad364a7de5fe5af7c983482d2b7 Mon Sep 17 00:00:00 2001 | ||||
| From: Stephen Gallagher <sgallagh@redhat.com> | ||||
| Date: Tue, 6 Mar 2012 11:34:41 -0500 | ||||
| Subject: [PATCH 2/2] path_utils: Handle "/" in path_concat | ||||
| 
 | ||||
| ---
 | ||||
|  path_utils/path_utils.c    |   12 ++++++++++-- | ||||
|  path_utils/path_utils_ut.c |    9 +++++++++ | ||||
|  2 files changed, 19 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/path_utils/path_utils.c b/path_utils/path_utils.c
 | ||||
| index 360d49943436681970691cc829c8039f3a0e8a5f..25ca4267fc0d7d9f3483646c2aef22fcdef1eb24 100644
 | ||||
| --- a/path_utils/path_utils.c
 | ||||
| +++ b/path_utils/path_utils.c
 | ||||
| @@ -202,14 +202,22 @@ int path_concat(char *path, size_t path_size, const char *head, const char *tail
 | ||||
|   | ||||
|      if (head && *head) { | ||||
|          for (p = head; *p; p++);                /* walk to end of head */ | ||||
| -        for (p--; p >= head && *p == '/'; p--); /* skip any trailing slashes in head */
 | ||||
| +        for (p--; p > head && *p == '/'; p--); /* skip any trailing slashes in head */
 | ||||
|          if ((p - head) > path_size-1) return ENOBUFS; | ||||
|          for (src = head; src <= p && dst < dst_end;) *dst++ = *src++; /* copy head */ | ||||
|      } | ||||
|      if (tail && *tail) { | ||||
|          for (p = tail; *p && *p == '/'; p++);   /* skip any leading slashes in tail */ | ||||
|          if (dst > path) | ||||
| -            if (dst < dst_end) *dst++ = '/';    /* insert single slash between head & tail */
 | ||||
| +            /* insert single slash between head & tail
 | ||||
| +             * Making sure not to add an extra if the
 | ||||
| +             * preceding character is also a slash
 | ||||
| +             * (such as the case where head was the
 | ||||
| +             * special-case "/".
 | ||||
| +             */
 | ||||
| +            if (dst < dst_end && *(dst-1) != '/') {
 | ||||
| +                *dst++ = '/';
 | ||||
| +            }
 | ||||
|          for (src = p; *src && dst < dst_end;) *dst++ = *src++; /* copy tail */ | ||||
|          if (*src) return ENOBUFS; /* failed to copy everything */ | ||||
|      } | ||||
| diff --git a/path_utils/path_utils_ut.c b/path_utils/path_utils_ut.c
 | ||||
| index fbefcab1eb66b5c36a3d7a74a099f569ea764b3b..34462cfdd4a2238f878a170fba2481b31f96e33e 100644
 | ||||
| --- a/path_utils/path_utils_ut.c
 | ||||
| +++ b/path_utils/path_utils_ut.c
 | ||||
| @@ -229,6 +229,15 @@ START_TEST(test_path_concat)
 | ||||
|      fail_unless(path_concat(p, PATH_MAX, "", "foo") == SUCCESS); | ||||
|      fail_unless_str_equal(p, "foo"); | ||||
|   | ||||
| +    fail_unless(path_concat(p, PATH_MAX, "/", "foo") == SUCCESS);
 | ||||
| +    fail_unless_str_equal(p, "/foo");
 | ||||
| +
 | ||||
| +    fail_unless(path_concat(p, PATH_MAX, "/foo", "/") == SUCCESS);
 | ||||
| +    fail_unless_str_equal(p, "/foo/");
 | ||||
| +
 | ||||
| +    fail_unless(path_concat(p, PATH_MAX, "/foo", "bar/") == SUCCESS);
 | ||||
| +    fail_unless_str_equal(p, "/foo/bar/");
 | ||||
| +
 | ||||
|      fail_unless(path_concat(p, PATH_MAX, NULL, "foo") == SUCCESS); | ||||
|      fail_unless_str_equal(p, "foo"); | ||||
|   | ||||
| -- 
 | ||||
| 1.7.7.6 | ||||
| 
 | ||||
| @ -1,6 +1,6 @@ | ||||
| Name: ding-libs | ||||
| Version: 0.1.3 | ||||
| Release: 6%{?dist} | ||||
| Release: 7%{?dist} | ||||
| Summary: "Ding is not GLib" assorted utility libraries | ||||
| Group: Development/Libraries | ||||
| License: LGPLv3+ | ||||
| @ -16,6 +16,9 @@ BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) | ||||
| 
 | ||||
| ### Patches ### | ||||
| 
 | ||||
| Patch0001: 0001-path_utils-handle-off-by-one-error-in-path_concat.patch | ||||
| Patch0002: 0002-path_utils-Handle-in-path_concat.patch | ||||
| 
 | ||||
| ### Dependencies ### | ||||
| 
 | ||||
| ### Build Dependencies ### | ||||
| @ -247,6 +250,9 @@ structure | ||||
| %prep | ||||
| %setup -q | ||||
| 
 | ||||
| %patch0001 -p1 | ||||
| %patch0002 -p1 | ||||
| 
 | ||||
| %build | ||||
| %configure \ | ||||
|     --disable-static | ||||
| @ -279,6 +285,11 @@ rm -f */doc/html/installdox | ||||
| rm -rf $RPM_BUILD_ROOT | ||||
| 
 | ||||
| %changelog | ||||
| * Tue Mar 06 2012 Stephen Gallagher <sgallagh@redhat.com> - 0.1.3-7 | ||||
| - Fix off-by-one bug in path_concat() | ||||
| - Resolves: rhbz#799347 - path_utils:test_path_concat_neg fails on 64-bit big | ||||
|                           endians | ||||
| 
 | ||||
| * Fri Jan 13 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.1.3-6 | ||||
| - Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user