Fix buffer length checking.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@793 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		| @@ -46,6 +46,7 @@ store_ticket(KTEXT cip) | |||||||
|     char srealm[REALM_SZ]; |     char srealm[REALM_SZ]; | ||||||
|     unsigned char kvno; |     unsigned char kvno; | ||||||
|     KTEXT_ST tkt; |     KTEXT_ST tkt; | ||||||
|  |     int left = cip->length; | ||||||
|  |  | ||||||
|     int kerror; |     int kerror; | ||||||
|      |      | ||||||
| @@ -56,42 +57,49 @@ store_ticket(KTEXT cip) | |||||||
|     /* extract session key */ |     /* extract session key */ | ||||||
|     memmove(session, ptr, 8); |     memmove(session, ptr, 8); | ||||||
|     ptr += 8; |     ptr += 8; | ||||||
|  |     left -= 8; | ||||||
|  |  | ||||||
|     if ((strlen(ptr) + (ptr - (char *) cip->dat)) > cip->length) |     if (strnlen(ptr, left) == left) | ||||||
| 	return(INTK_BADPW); | 	return(INTK_BADPW); | ||||||
|      |      | ||||||
|     /* extract server's name */ |     /* extract server's name */ | ||||||
|     strcpy(sname,ptr); |     strcpy(sname,ptr); | ||||||
|     ptr += strlen(sname) + 1; |     ptr += strlen(sname) + 1; | ||||||
|  |     left -= strlen(sname) + 1; | ||||||
|  |  | ||||||
|     if ((strlen(ptr) + (ptr - (char *) cip->dat)) > cip->length) |     if (strnlen(ptr, left) == left) | ||||||
| 	return(INTK_BADPW); | 	return(INTK_BADPW); | ||||||
|  |  | ||||||
|     /* extract server's instance */ |     /* extract server's instance */ | ||||||
|     strcpy(sinst, ptr); |     strcpy(sinst, ptr); | ||||||
|     ptr += strlen(sinst) + 1; |     ptr += strlen(sinst) + 1; | ||||||
|  |     left -= strlen(sinst) + 1; | ||||||
|  |  | ||||||
|     if ((strlen(ptr) + (ptr - (char *) cip->dat)) > cip->length) |     if (strnlen(ptr, left) == left) | ||||||
| 	return(INTK_BADPW); | 	return(INTK_BADPW); | ||||||
|  |  | ||||||
|     /* extract server's realm */ |     /* extract server's realm */ | ||||||
|     strcpy(srealm,ptr); |     strcpy(srealm,ptr); | ||||||
|     ptr += strlen(srealm) + 1; |     ptr += strlen(srealm) + 1; | ||||||
|  |     left -= strlen(srealm) + 1; | ||||||
|  |  | ||||||
|  |     if(left < 3) | ||||||
|  | 	return INTK_BADPW; | ||||||
|     /* extract ticket lifetime, server key version, ticket length */ |     /* extract ticket lifetime, server key version, ticket length */ | ||||||
|     /* be sure to avoid sign extension on lifetime! */ |     /* be sure to avoid sign extension on lifetime! */ | ||||||
|     lifetime = (unsigned char) ptr[0]; |     lifetime = (unsigned char) ptr[0]; | ||||||
|     kvno = (unsigned char) ptr[1]; |     kvno = (unsigned char) ptr[1]; | ||||||
|     tkt.length = (unsigned char) ptr[2]; |     tkt.length = (unsigned char) ptr[2]; | ||||||
|     ptr += 3; |     ptr += 3; | ||||||
|  |     left -= 3; | ||||||
|      |      | ||||||
|     if ((tkt.length < 0) || |     if (tkt.length > left) | ||||||
| 	((tkt.length + (ptr - (char *) cip->dat)) > cip->length)) |  | ||||||
| 	return(INTK_BADPW); | 	return(INTK_BADPW); | ||||||
|  |  | ||||||
|     /* extract ticket itself */ |     /* extract ticket itself */ | ||||||
|     memmove(tkt.dat, ptr, tkt.length); |     memmove(tkt.dat, ptr, tkt.length); | ||||||
|     ptr += tkt.length; |     ptr += tkt.length; | ||||||
|  |     left -= tkt.length; | ||||||
|  |  | ||||||
|     /* Here is where the time should be verified against the KDC. |     /* Here is where the time should be verified against the KDC. | ||||||
|      * Unfortunately everything is sent in host byte order (receiver |      * Unfortunately everything is sent in host byte order (receiver | ||||||
| @@ -145,7 +153,7 @@ void kauth(char *principal, char *ticket) | |||||||
| 	return; | 	return; | ||||||
|     } |     } | ||||||
|     if(realm[0] == 0) |     if(realm[0] == 0) | ||||||
| 	krb_get_lrealm(realm, 0); | 	krb_get_lrealm(realm, 1); | ||||||
|  |  | ||||||
|     if(ticket){ |     if(ticket){ | ||||||
| 	cip.length = base64_decode(ticket, &cip.dat); | 	cip.length = base64_decode(ticket, &cip.dat); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Johan Danielsson
					Johan Danielsson