summaryrefslogtreecommitdiff
path: root/extra/cvsps/cvsps-buffer-overflow.patch
blob: e34fd6ee39fe22c7f29457859ae706ae51106d5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
diff -Naur cvsps-3.2.orig/cvsps.c cvsps-3.2/cvsps.c
--- cvsps-3.2.orig/cvsps.c	2012-12-24 19:23:24.000000000 +0000
+++ cvsps-3.2/cvsps.c	2012-12-27 03:28:24.698076155 +0000
@@ -1078,17 +1078,16 @@
 static CvsFile * parse_rcs_file(const char * buff)
 {
     char fn[PATH_MAX];
-    int len = strlen(buff + 10);
+    size_t len = strlen(buff + 10);
     char * p;
 
     /* once a single file has been parsed ok we set this */
     static bool path_ok;
-    
+
     /* chop the ",v" string and the "LF" */
     len -= 3;
     memcpy(fn, buff + 10, len);
     fn[len] = 0;
-    
     if (strncmp(fn, strip_path, strip_path_len) != 0)
     {
 	/* if the very first file fails the strip path,
@@ -1109,10 +1108,10 @@
 
 	    while ((p = strstr(p, repository_path)))
 		lastp = p++;
-      
+
 	    if (lastp)
 	    {
-		int len = strlen(repository_path);
+		size_t len = strlen(repository_path);
 		memcpy(strip_path, fn, lastp - fn + len + 1);
 		strip_path_len = lastp - fn + len + 1;
 		strip_path[strip_path_len] = 0;
@@ -1136,16 +1135,26 @@
 	 *
 	 * For now just ignore such files
 	 */
-	debug(DEBUG_APPWARN, "WARNING: file %s doesn't match strip_path %s. ignoring", 
+	debug(DEBUG_APPWARN, "WARNING: file %s doesn't match strip_path %s. ignoring",
 	      fn, strip_path);
 	return NULL;
     }
 
  ok:
-    path_ok = true;
-
+     /*
+     fix for rhbz#576076
+     ./cvsps --norc -q --cvs-direct -u -A --root :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot NSS
+     */
+    if(len <= strip_path_len)
+    {
+        debug(DEBUG_APPWARN, "WARNING: file %s doesn't match strip_path %s. ignoring",
+	      fn, strip_path);
+        return NULL;
+    }
     /* remove from beginning the 'strip_path' string */
     len -= strip_path_len;
+    path_ok = true;
+
     memmove(fn, fn + strip_path_len, len);
     fn[len] = 0;