Skip to content

Commit a6e34b3

Browse files
committedMar 9, 2021
8262829: Native crash in Win32PrintServiceLookup.getAllPrinterNames()
Reviewed-by: prr, psadhukhan, serb
1 parent fbe40e8 commit a6e34b3

File tree

1 file changed

+20
-7
lines changed

1 file changed

+20
-7
lines changed
 

‎src/java.desktop/windows/native/libawt/windows/WPrinterJob.cpp

+20-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2000, 2021, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -133,12 +133,25 @@ static jobjectArray getPrinterNames(JNIEnv *env, DWORD flags) {
133133
jobjectArray nameArray;
134134

135135
try {
136-
::EnumPrinters(flags,
137-
NULL, 4, NULL, 0, &cbNeeded, &cReturned);
138-
pPrinterEnum = new BYTE[cbNeeded];
139-
::EnumPrinters(flags,
140-
NULL, 4, pPrinterEnum, cbNeeded, &cbNeeded,
141-
&cReturned);
136+
::EnumPrinters(flags, NULL, 4, NULL,
137+
0, &cbNeeded, &cReturned);
138+
139+
BOOL bResult;
140+
int nCount = 0;
141+
do {
142+
if (pPrinterEnum != NULL) {
143+
delete [] pPrinterEnum;
144+
}
145+
pPrinterEnum = new BYTE[cbNeeded];
146+
147+
bResult = ::EnumPrinters(flags, NULL, 4, pPrinterEnum,
148+
cbNeeded, &cbNeeded, &cReturned);
149+
} while (!bResult && ++nCount < 5);
150+
151+
if (!bResult) {
152+
// No printers in case of error
153+
cReturned = 0;
154+
}
142155

143156
if (cReturned > 0) {
144157
nameArray = env->NewObjectArray(cReturned, clazz, NULL);

0 commit comments

Comments
 (0)