File gypsy-CVE-2011-0524.patch of Package gypsy

From 03932804cd4b8e5a79c483fb05c82743f5ee93a2 Mon Sep 17 00:00:00 2001
From: Bastien Nocera <hadess@hadess.net>
Date: Wed, 12 Oct 2011 12:15:44 +0100
Subject: [PATCH] Prevent buffer overflows in NMEA parsing

By using snprintf() instead of sprintf.

https://bugs.freedesktop.org/show_bug.cgi?id=33431
---
 src/nmea-gen.c |   61 ++++++++++++++++++++++++++++---------------------------
 1 files changed, 31 insertions(+), 30 deletions(-)

diff --git a/src/nmea-gen.c b/src/nmea-gen.c
index a8c2483..c52f925 100644
--- a/src/nmea-gen.c
+++ b/src/nmea-gen.c
@@ -54,6 +54,7 @@
 #include "nmea-gen.h"
 
 #define NMEA_BUF_SIZE		256
+#define NMEASTC_BUF_SIZE	256
 #define NMEA_LATLON_SIZE	16
 #define NMEA_UTC_SIZE		16
 
@@ -121,7 +122,7 @@ void nmea_getutc(D800_Pvt_Data_Type *pvt, char *utctime, char *utcdate) {
 		h = tmp / 3600;
 		m = (tmp - h*3600) / 60;
 		s = (tmp - h*3600 - m*60);
-		sprintf(utctime, "%02d%02d%02d", h, m, s);
+		snprintf(utctime, NMEA_UTC_SIZE, "%02d%02d%02d", h, m, s);
 	}
 
 	if (utcdate) {
@@ -149,7 +150,7 @@ void nmea_getutc(D800_Pvt_Data_Type *pvt, char *utctime, char *utcdate) {
 
 		year -= 2000;
 
-		sprintf(utcdate, "%02d%02d%02d", day, month, year);
+		snprintf(utcdate, NMEA_UTC_SIZE, "%02d%02d%02d", day, month, year);
 	}
 }
 
@@ -157,16 +158,16 @@ void nmea_fmtlat(double lat, char *latstr) {
 	double	latdeg, tmp;
 	latdeg = rad2deg(fabs(lat));
 	tmp = floor(latdeg);
-	sprintf(latstr, "%02d%07.4f,%c", (int)tmp, (latdeg - tmp) * 60,
-		(lat >= 0) ? 'N' : 'S');
+	snprintf(latstr, NMEA_LATLON_SIZE, "%02d%07.4f,%c", (int)tmp, (latdeg - tmp) * 60,
+		 (lat >= 0) ? 'N' : 'S');
 }
 
 void nmea_fmtlon(double lon, char *lonstr) {
 	double	londeg, tmp;
 	londeg = rad2deg(fabs(lon));
 	tmp = floor(londeg);
-	sprintf(lonstr, "%03d%07.4f,%c", (int)tmp, (londeg - tmp) * 60,
-		(lon >= 0) ? 'E' : 'W');
+	snprintf(lonstr, NMEA_LATLON_SIZE, "%03d%07.4f,%c", (int)tmp, (londeg - tmp) * 60,
+		 (lon >= 0) ? 'E' : 'W');
 }
 
 /*
@@ -216,12 +217,12 @@ int nmea_gpgga(D800_Pvt_Data_Type *pvt, cpo_sat_data *sat, char *nmeastc) {
 		}
 	}
 
-	sprintf(buf, "GPGGA,%s,%s,%s,%d,%02d,,%.1f,M,%.1f,M,,", utc, slat, slon, fix, nsat,
-		pvt->msl_hght + pvt->alt, -pvt->msl_hght);
+	snprintf(buf, NMEA_BUF_SIZE, "GPGGA,%s,%s,%s,%d,%02d,,%.1f,M,%.1f,M,,", utc, slat, slon, fix, nsat,
+		 pvt->msl_hght + pvt->alt, -pvt->msl_hght);
 
 	cksum = nmea_cksum(buf);
 
-	sprintf(nmeastc, "$%s*%02X\r\n", buf, cksum);
+	snprintf(nmeastc, NMEASTC_BUF_SIZE, "$%s*%02X\r\n", buf, cksum);
 
 	return 0;
 }
@@ -268,13 +269,13 @@ int nmea_gprmc(D800_Pvt_Data_Type *pvt, char *nmeastc) {
 		g_lastcourse = course;	/* remember for later */
 	}
 
-	sprintf(buf, "GPRMC,%s,%c,%s,%s,%05.1f,%05.1f,%s,,", utctime,
-		(pvt->fix >= 2 && pvt->fix <= 5) ? 'A' : 'V',
-		slat, slon, speed, course, utcdate);
+	snprintf(buf, NMEA_BUF_SIZE, "GPRMC,%s,%c,%s,%s,%05.1f,%05.1f,%s,,", utctime,
+		 (pvt->fix >= 2 && pvt->fix <= 5) ? 'A' : 'V',
+		 slat, slon, speed, course, utcdate);
 
 	cksum = nmea_cksum(buf);
 
-	sprintf(nmeastc, "$%s*%02X\r\n", buf, cksum);
+	snprintf(nmeastc, NMEASTC_BUF_SIZE, "$%s*%02X\r\n", buf, cksum);
 
 	return 0;
 }
@@ -298,12 +299,12 @@ int nmea_gpgll(D800_Pvt_Data_Type *pvt, char *nmeastc) {
 	/* longitude */
 	nmea_fmtlon(pvt->lon, slon);
 
-	sprintf(buf, "GPGLL,%s,%s,%s,%c", slat, slon, utctime,
-		(pvt->fix >= 2 && pvt->fix <= 5) ? 'A' : 'V');
+	snprintf(buf, NMEA_BUF_SIZE, "GPGLL,%s,%s,%s,%c", slat, slon, utctime,
+		 (pvt->fix >= 2 && pvt->fix <= 5) ? 'A' : 'V');
 
 	cksum = nmea_cksum(buf);
 
-	sprintf(nmeastc, "$%s*%02X\r\n", buf, cksum);
+	snprintf(nmeastc, NMEASTC_BUF_SIZE, "$%s*%02X\r\n", buf, cksum);
 
 	return 0;
 }
@@ -334,7 +335,7 @@ int nmea_gpgsa(D800_Pvt_Data_Type *pvt, cpo_sat_data *sat, char *nmeastc) {
 		fprintf(stderr, "WARNING: unknown fix type %d\n", pvt->fix);
 	}
 
-	sprintf(buf, "GPGSA,A,%d", fix);
+	snprintf(buf, NMEA_BUF_SIZE, "GPGSA,A,%d", fix);
 
 	if (sat != NULL) {
 		for (i = 0; i < SAT_MAX_COUNT; i++) {
@@ -343,7 +344,7 @@ int nmea_gpgsa(D800_Pvt_Data_Type *pvt, cpo_sat_data *sat, char *nmeastc) {
 #ifdef DEBUG
 				g_debug ("%s:     using sat %2d", __FUNCTION__, sat[i].svid);
 #endif
-				sprintf(buf+strlen(buf), ",%02d", sat[i].svid);
+				snprintf(buf+strlen(buf), NMEA_BUF_SIZE - strlen(buf), ",%02d", sat[i].svid);
 				nsat++;
 			}
 			else
@@ -362,10 +363,10 @@ int nmea_gpgsa(D800_Pvt_Data_Type *pvt, cpo_sat_data *sat, char *nmeastc) {
 		strcat(buf, ",,,,,,,,,,,,");
 	}
 
-	sprintf(buf+strlen(buf), ",,,");	// this should be DOP info
+	snprintf(buf+strlen(buf), NMEA_BUF_SIZE - strlen(buf),",,,");	// this should be DOP info
 
 	cksum = nmea_cksum(buf);
-	sprintf(nmeastc, "$%s*%02X\r\n", buf, cksum);
+	snprintf(nmeastc, NMEASTC_BUF_SIZE, "$%s*%02X\r\n", buf, cksum);
 
 	return 0;
 }
@@ -386,9 +387,9 @@ int nmea_gpgsv(cpo_sat_data *sat, char *nmeastc) {
 	int		nsat, i, nout, msgi;
 
 	if (sat == NULL) {
-		sprintf(buf, "GPGSV,1,1,00");
+		snprintf(buf, NMEA_BUF_SIZE, "GPGSV,1,1,00");
 		cksum = nmea_cksum(buf);
-		sprintf(nmeastc, "$%s*%02X\r\n", buf, cksum);
+		snprintf(nmeastc, NMEASTC_BUF_SIZE, "$%s*%02X\r\n", buf, cksum);
 		return 0;
 	}
 
@@ -417,15 +418,15 @@ int nmea_gpgsv(cpo_sat_data *sat, char *nmeastc) {
 
 	if (nsat == 0) {
 		/* build a 'null' GPGSV string */
-		sprintf(buf, "GPGSV,1,1,00");
+		snprintf(buf, NMEA_BUF_SIZE, "GPGSV,1,1,00");
 		cksum = nmea_cksum(buf);
-		sprintf(nmeastc, "$%s*%02X\r\n", buf, cksum);
+		snprintf(nmeastc, NMEASTC_BUF_SIZE, "$%s*%02X\r\n", buf, cksum);
 	} else {
 		/* scan the array again and build the GPGSV string(s) of active sats */
 		nout = 0;
 		msgi = 1;
 		nmeastc[0] = 0;
-		sprintf(buf, "GPGSV,%d,%d,%02d", (nsat-1)/4+1, msgi, nsat);
+		snprintf(buf, NMEA_BUF_SIZE, "GPGSV,%d,%d,%02d", (nsat-1)/4+1, msgi, nsat);
 		for (i = 0; i < SAT_MAX_COUNT; i++) {
 			if (((sat[i].status & SAT_STATUS_MASK) == SAT_STATUS_GOOD) && (sat[i].svid <= MAX_SAT_SVID)) {
 				int snr;
@@ -435,24 +436,24 @@ int nmea_gpgsv(cpo_sat_data *sat, char *nmeastc) {
 //				else
 					snr = sat[i].snr/100;	/* empirically, this seems to be the correct factor */
 
-				sprintf(buf+strlen(buf), ",%02d,%02d,%03d,%02d",
-					sat[i].svid, sat[i].elev, sat[i].azmth, snr);
+				snprintf(buf+strlen(buf), NMEA_BUF_SIZE - strlen(buf), ",%02d,%02d,%03d,%02d",
+					 sat[i].svid, sat[i].elev, sat[i].azmth, snr);
 				nout++;
 
 				/* if we have accumulated a group of 4 sats, write out the string */
 				if (nout == 4) {
 					cksum = nmea_cksum(buf);
-					sprintf(nmeastc+strlen(nmeastc), "$%s*%02X\r\n", buf, cksum);
+					snprintf(nmeastc+strlen(nmeastc), NMEASTC_BUF_SIZE - strlen(nmeastc), "$%s*%02X\r\n", buf, cksum);
 					msgi++;
 					nout = 0;
-					sprintf(buf, "GPGSV,%d,%d,%02d", (nsat-1)/4+1, msgi, nsat);
+					snprintf(buf, NMEA_BUF_SIZE, "GPGSV,%d,%d,%02d", (nsat-1)/4+1, msgi, nsat);
 				}
 			}
 		}
 
 		if (nout != 0) {
 			cksum = nmea_cksum(buf);
-			sprintf(nmeastc+strlen(nmeastc), "$%s*%02X\r\n", buf, cksum);
+			snprintf(nmeastc+strlen(nmeastc), NMEASTC_BUF_SIZE - strlen(nmeastc), "$%s*%02X\r\n", buf, cksum);
 		}
 	}
 
-- 
1.7.6.2

openSUSE Build Service is sponsored by