7e0a4d
From 06d1b08aef94984256cad3c5a54cedb10295681f Mon Sep 17 00:00:00 2001
7e0a4d
From: Jakub Martisko <jamartis@redhat.com>
7e0a4d
Date: Thu, 8 Nov 2018 09:31:18 +0100
7e0a4d
Subject: [PATCH] Possible unterminated string fix
7e0a4d
7e0a4d
---
7e0a4d
 unix/unix.c   |  4 +++-
7e0a4d
 unix/unxcfg.h |  2 +-
7e0a4d
 unzip.c       | 12 ++++++++----
7e0a4d
 zipinfo.c     | 12 ++++++++----
7e0a4d
 4 files changed, 20 insertions(+), 10 deletions(-)
7e0a4d
7e0a4d
diff --git a/unix/unix.c b/unix/unix.c
7e0a4d
index 59b622d..cd57f80 100644
7e0a4d
--- a/unix/unix.c
7e0a4d
+++ b/unix/unix.c
7e0a4d
@@ -1945,7 +1945,9 @@ void init_conversion_charsets()
7e0a4d
     	for(i = 0; i < sizeof(dos_charset_map)/sizeof(CHARSET_MAP); i++)
7e0a4d
     		if(!strcasecmp(local_charset, dos_charset_map[i].local_charset)) {
7e0a4d
     			strncpy(OEM_CP, dos_charset_map[i].archive_charset,
7e0a4d
-    					sizeof(OEM_CP));
7e0a4d
+    					MAX_CP_NAME - 1);
7e0a4d
+
7e0a4d
+			OEM_CP[MAX_CP_NAME - 1] = '\0';
7e0a4d
     			break;
7e0a4d
     		}
7e0a4d
     }
7e0a4d
diff --git a/unix/unxcfg.h b/unix/unxcfg.h
7e0a4d
index 8729de2..9ee8cfe 100644
7e0a4d
--- a/unix/unxcfg.h
7e0a4d
+++ b/unix/unxcfg.h
7e0a4d
@@ -228,7 +228,7 @@ typedef struct stat z_stat;
7e0a4d
 /*    and notfirstcall are used by do_wild().                          */
7e0a4d
 
7e0a4d
 
7e0a4d
-#define MAX_CP_NAME 25 
7e0a4d
+#define MAX_CP_NAME 25 + 1 
7e0a4d
    
7e0a4d
 #ifdef SETLOCALE
7e0a4d
 #  undef SETLOCALE
7e0a4d
diff --git a/unzip.c b/unzip.c
7e0a4d
index 2d94a38..a485f2b 100644
7e0a4d
--- a/unzip.c
7e0a4d
+++ b/unzip.c
7e0a4d
@@ -1561,7 +1561,8 @@ int uz_opts(__G__ pargc, pargv)
7e0a4d
         		                  "error:  a valid character encoding should follow the -I argument"));
7e0a4d
     	                        return(PK_PARAM); 
7e0a4d
     						}
7e0a4d
-    						strncpy(ISO_CP, s, sizeof(ISO_CP));
7e0a4d
+    						strncpy(ISO_CP, s, MAX_CP_NAME - 1);
7e0a4d
+                ISO_CP[MAX_CP_NAME - 1] = '\0';
7e0a4d
     					} else { /* -I charset */
7e0a4d
     						++argv;
7e0a4d
     						if(!(--argc > 0 && *argv != NULL && **argv != '-')) {
7e0a4d
@@ -1570,7 +1571,8 @@ int uz_opts(__G__ pargc, pargv)
7e0a4d
     	                        return(PK_PARAM); 
7e0a4d
     						}
7e0a4d
     						s = *argv;
7e0a4d
-    						strncpy(ISO_CP, s, sizeof(ISO_CP));
7e0a4d
+    						strncpy(ISO_CP, s, MAX_CP_NAME - 1);
7e0a4d
+                ISO_CP[MAX_CP_NAME - 1] = '\0';
7e0a4d
     					}
7e0a4d
     					while(*(++s)); /* No params straight after charset name */
7e0a4d
     				}
7e0a4d
@@ -1665,7 +1667,8 @@ int uz_opts(__G__ pargc, pargv)
7e0a4d
         		                  "error:  a valid character encoding should follow the -I argument"));
7e0a4d
     	                        return(PK_PARAM); 
7e0a4d
     						}
7e0a4d
-    						strncpy(OEM_CP, s, sizeof(OEM_CP));
7e0a4d
+    						strncpy(OEM_CP, s, MAX_CP_NAME - 1);
7e0a4d
+                OEM_CP[MAX_CP_NAME - 1] = '\0';
7e0a4d
     					} else { /* -O charset */
7e0a4d
     						++argv;
7e0a4d
     						if(!(--argc > 0 && *argv != NULL && **argv != '-')) {
7e0a4d
@@ -1674,7 +1677,8 @@ int uz_opts(__G__ pargc, pargv)
7e0a4d
     	                        return(PK_PARAM); 
7e0a4d
     						}
7e0a4d
     						s = *argv;
7e0a4d
-    						strncpy(OEM_CP, s, sizeof(OEM_CP));
7e0a4d
+    						strncpy(OEM_CP, s, MAX_CP_NAME - 1);
7e0a4d
+                OEM_CP[MAX_CP_NAME - 1] = '\0';
7e0a4d
     					}
7e0a4d
     					while(*(++s)); /* No params straight after charset name */
7e0a4d
     				}
7e0a4d
diff --git a/zipinfo.c b/zipinfo.c
7e0a4d
index accca2a..cb7e08d 100644
7e0a4d
--- a/zipinfo.c
7e0a4d
+++ b/zipinfo.c
7e0a4d
@@ -519,7 +519,8 @@ int zi_opts(__G__ pargc, pargv)
7e0a4d
         		                  "error:  a valid character encoding should follow the -I argument"));
7e0a4d
     	                        return(PK_PARAM); 
7e0a4d
     						}
7e0a4d
-    						strncpy(ISO_CP, s, sizeof(ISO_CP));
7e0a4d
+    						strncpy(ISO_CP, s, MAX_CP_NAME - 1);
7e0a4d
+                ISO_CP[MAX_CP_NAME - 1] = '\0';
7e0a4d
     					} else { /* -I charset */
7e0a4d
     						++argv;
7e0a4d
     						if(!(--argc > 0 && *argv != NULL && **argv != '-')) {
7e0a4d
@@ -528,7 +529,8 @@ int zi_opts(__G__ pargc, pargv)
7e0a4d
     	                        return(PK_PARAM); 
7e0a4d
     						}
7e0a4d
     						s = *argv;
7e0a4d
-    						strncpy(ISO_CP, s, sizeof(ISO_CP));
7e0a4d
+    						strncpy(ISO_CP, s, MAX_CP_NAME - 1);
7e0a4d
+                ISO_CP[MAX_CP_NAME - 1] = '\0';
7e0a4d
     					}
7e0a4d
     					while(*(++s)); /* No params straight after charset name */
7e0a4d
     				}
7e0a4d
@@ -568,7 +570,8 @@ int zi_opts(__G__ pargc, pargv)
7e0a4d
         		                  "error:  a valid character encoding should follow the -I argument"));
7e0a4d
     	                        return(PK_PARAM); 
7e0a4d
     						}
7e0a4d
-    						strncpy(OEM_CP, s, sizeof(OEM_CP));
7e0a4d
+    						strncpy(OEM_CP, s, MAX_CP_NAME - 1);
7e0a4d
+                OEM_CP[MAX_CP_NAME - 1] = '\0';
7e0a4d
     					} else { /* -O charset */
7e0a4d
     						++argv;
7e0a4d
     						if(!(--argc > 0 && *argv != NULL && **argv != '-')) {
7e0a4d
@@ -577,7 +580,8 @@ int zi_opts(__G__ pargc, pargv)
7e0a4d
     	                        return(PK_PARAM); 
7e0a4d
     						}
7e0a4d
     						s = *argv;
7e0a4d
-    						strncpy(OEM_CP, s, sizeof(OEM_CP));
7e0a4d
+    						strncpy(OEM_CP, s, MAX_CP_NAME - 1);
7e0a4d
+                OEM_CP[MAX_CP_NAME - 1] = '\0';
7e0a4d
     					}
7e0a4d
     					while(*(++s)); /* No params straight after charset name */
7e0a4d
     				}
7e0a4d
-- 
7e0a4d
2.14.5
7e0a4d