Skip to content

Commit decfd78

Browse files
committed
cupsfilters: ieee1284: fix out-of-bounds read in NormalizeMakeModel
When a user-supplied make string is longer than bufsize, snprintf() truncates the output but modelptr was still calculated using the original strlen(make), resulting in modelptr pointing past the end of buffer. A subsequent strncasecmp() call then caused an out-of-bounds read. Key changes: - Add bounds check for modelptr after all snprintf() calls that set it to a fixed offset (Xerox, Kodak, Apple, Seiko, EFI, Canon, Fargo, HP, Kyocera, and user-supplied make string cases) - Add strlen(buffer) guard before accessing buffer at fixed indices in the known multi-word manufacturer name checks (konica minolta, fuji xerox, lexmark international, kyocera mita) - Add strlen(make) < bufsize guard before accessing buffer[strlen(make)] to prevent out-of-bounds access in the make-prefix match check - Keep a catch-all safety clamp for modelptr at the end of the manufacturer block #Fixes #136 Signed-off-by: Omkar Nanajkar <nomkar2131@gmail.com>
1 parent 1408f93 commit decfd78

1 file changed

Lines changed: 38 additions & 6 deletions

File tree

cupsfilters/ieee1284.c

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -845,13 +845,18 @@ cfIEEE1284NormalizeMakeModel(
845845
//
846846

847847
modelptr = buffer + (make - make_and_model);
848-
else if (!strncasecmp(buffer, make, strlen(make)) &&
848+
else if (strlen(make) < bufsize &&
849+
!strncasecmp(buffer, make, strlen(make)) &&
849850
isspace(buffer[strlen(make)]))
851+
{
850852
//
851853
// User-supplied make string matches start of input
852854
//
853855

854856
modelptr = buffer + strlen(make) + 1;
857+
if (modelptr >= buffer + strlen(buffer))
858+
modelptr = buffer + strlen(buffer);
859+
}
855860
else
856861
{
857862
//
@@ -860,6 +865,8 @@ cfIEEE1284NormalizeMakeModel(
860865

861866
snprintf(buffer, bufsize, "%s %s", make, make_and_model);
862867
modelptr = buffer + strlen(make) + 1;
868+
if (modelptr >= buffer + strlen(buffer))
869+
modelptr = buffer + strlen(buffer);
863870
}
864871
}
865872

@@ -880,6 +887,8 @@ cfIEEE1284NormalizeMakeModel(
880887

881888
snprintf(buffer, bufsize, "Xerox %s", make_and_model);
882889
modelptr = buffer + 6;
890+
if (modelptr >= buffer + strlen(buffer))
891+
modelptr = buffer + strlen(buffer);
883892
}
884893
else if (!strncasecmp(make_and_model, "Eastman", 7))
885894
{
@@ -889,6 +898,8 @@ cfIEEE1284NormalizeMakeModel(
889898

890899
snprintf(buffer, bufsize, "Kodak %s", make_and_model + 7);
891900
modelptr = buffer + 6;
901+
if (modelptr >= buffer + strlen(buffer))
902+
modelptr = buffer + strlen(buffer);
892903
}
893904
else if (!strncasecmp(make_and_model, "laserwriter", 11))
894905
{
@@ -898,6 +909,8 @@ cfIEEE1284NormalizeMakeModel(
898909

899910
snprintf(buffer, bufsize, "Apple LaserWriter%s", make_and_model + 11);
900911
modelptr = buffer + 6;
912+
if (modelptr >= buffer + strlen(buffer))
913+
modelptr = buffer + strlen(buffer);
901914
}
902915
else if (!strncasecmp(make_and_model, "colorpoint", 10))
903916
{
@@ -907,6 +920,8 @@ cfIEEE1284NormalizeMakeModel(
907920

908921
snprintf(buffer, bufsize, "Seiko %s", make_and_model);
909922
modelptr = buffer + 6;
923+
if (modelptr >= buffer + strlen(buffer))
924+
modelptr = buffer + strlen(buffer);
910925
}
911926
else if (!strncasecmp(make_and_model, "fiery", 5))
912927
{
@@ -916,6 +931,8 @@ cfIEEE1284NormalizeMakeModel(
916931

917932
snprintf(buffer, bufsize, "EFI %s", make_and_model);
918933
modelptr = buffer + 4;
934+
if (modelptr >= buffer + strlen(buffer))
935+
modelptr = buffer + strlen(buffer);
919936
}
920937
else if (!strncasecmp(make_and_model, "ps ", 3) ||
921938
!strncasecmp(make_and_model, "colorpass", 9))
@@ -926,6 +943,8 @@ cfIEEE1284NormalizeMakeModel(
926943

927944
snprintf(buffer, bufsize, "Canon %s", make_and_model);
928945
modelptr = buffer + 6;
946+
if (modelptr >= buffer + strlen(buffer))
947+
modelptr = buffer + strlen(buffer);
929948
}
930949
else if (!strncasecmp(make_and_model, "primera", 7))
931950
{
@@ -935,6 +954,8 @@ cfIEEE1284NormalizeMakeModel(
935954

936955
snprintf(buffer, bufsize, "Fargo %s", make_and_model);
937956
modelptr = buffer + 6;
957+
if (modelptr >= buffer + strlen(buffer))
958+
modelptr = buffer + strlen(buffer);
938959
}
939960
else if (!strncasecmp(make_and_model, "designjet", 9) ||
940961
!strncasecmp(make_and_model, "deskjet", 7) ||
@@ -947,6 +968,8 @@ cfIEEE1284NormalizeMakeModel(
947968

948969
snprintf(buffer, bufsize, "HP %s", make_and_model);
949970
modelptr = buffer + 3;
971+
if (modelptr >= buffer + strlen(buffer))
972+
modelptr = buffer + strlen(buffer);
950973
}
951974
else if (!strncasecmp(make_and_model, "ecosys", 6))
952975
{
@@ -956,22 +979,28 @@ cfIEEE1284NormalizeMakeModel(
956979

957980
snprintf(buffer, bufsize, "Kyocera %s", make_and_model);
958981
modelptr = buffer + 8;
982+
if (modelptr >= buffer + strlen(buffer))
983+
modelptr = buffer + strlen(buffer);
959984
}
960985

961986
//
962987
// Known make names with space
963988
//
964989

965-
else if (strncasecmp(buffer, "konica minolta", 14) &&
990+
else if (strlen(buffer) >= 15 &&
991+
strncasecmp(buffer, "konica minolta", 14) &&
966992
isspace(buffer[14]))
967993
modelptr = buffer + 15;
968-
else if (strncasecmp(buffer, "fuji xerox", 10) &&
994+
else if (strlen(buffer) >= 11 &&
995+
strncasecmp(buffer, "fuji xerox", 10) &&
969996
isspace(buffer[10]))
970997
modelptr = buffer + 11;
971-
else if (strncasecmp(buffer, "lexmark international", 21) &&
998+
else if (strlen(buffer) >= 22 &&
999+
strncasecmp(buffer, "lexmark international", 21) &&
9721000
isspace(buffer[21]))
9731001
modelptr = buffer + 22;
974-
else if (strncasecmp(buffer, "kyocera mita", 12) &&
1002+
else if (strlen(buffer) >= 13 &&
1003+
strncasecmp(buffer, "kyocera mita", 12) &&
9751004
isspace(buffer[12]))
9761005
modelptr = buffer + 13;
9771006

@@ -991,6 +1020,9 @@ cfIEEE1284NormalizeMakeModel(
9911020
// Adjust modelptr to the actual start of the model name
9921021
//
9931022

1023+
if (modelptr && modelptr > buffer + strlen(buffer))
1024+
modelptr = buffer + strlen(buffer);
1025+
9941026
if (modelptr)
9951027
while (!isalnum(*modelptr) && *modelptr != '\0')
9961028
modelptr ++;
@@ -1346,4 +1378,4 @@ cfIEEE1284NormalizeMakeModel(
13461378
if (extra) *extra = extraptr;
13471379
if (drvname) *drvname = drvptr;
13481380
return (buffer[0] ? buffer : NULL);
1349-
}
1381+
}

0 commit comments

Comments
 (0)