--- a/jdk/src/windows/native/sun/windows/awt_PrintControl.cpp Fri Apr 04 20:18:53 2014 +0400
+++ b/jdk/src/windows/native/sun/windows/awt_PrintControl.cpp Fri Apr 04 20:26:01 2014 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -233,107 +233,166 @@
TRY;
jclass cls = env->FindClass("sun/awt/windows/WPrinterJob");
+ CHECK_NULL(cls);
AwtPrintControl::dialogOwnerPeerID =
env->GetFieldID(cls, "dialogOwnerPeer", "Ljava/awt/peer/ComponentPeer;");
+ DASSERT(AwtPrintControl::dialogOwnerPeerID != NULL);
+ CHECK_NULL(AwtPrintControl::dialogOwnerPeerID);
+
AwtPrintControl::getPrintDCID = env->GetMethodID(cls, "getPrintDC", "()J");
+ DASSERT(AwtPrintControl::getPrintDCID != NULL);
+ CHECK_NULL(AwtPrintControl::getPrintDCID);
+
AwtPrintControl::setPrintDCID =
env->GetMethodID(cls, "setPrintDC", "(J)V");
+ DASSERT(AwtPrintControl::setPrintDCID != NULL);
+ CHECK_NULL(AwtPrintControl::setPrintDCID);
+
AwtPrintControl::getDevmodeID = env->GetMethodID(cls, "getDevMode", "()J");
+ DASSERT(AwtPrintControl::getDevmodeID != NULL);
+ CHECK_NULL(AwtPrintControl::getDevmodeID);
+
AwtPrintControl::setDevmodeID =
env->GetMethodID(cls, "setDevMode", "(J)V");
+ DASSERT(AwtPrintControl::setDevmodeID != NULL);
+ CHECK_NULL(AwtPrintControl::setDevmodeID);
+
AwtPrintControl::getDevnamesID =
env->GetMethodID(cls, "getDevNames", "()J");
+ DASSERT(AwtPrintControl::getDevnamesID != NULL);
+ CHECK_NULL(AwtPrintControl::getDevnamesID);
+
AwtPrintControl::setDevnamesID =
env->GetMethodID(cls, "setDevNames", "(J)V");
+ DASSERT(AwtPrintControl::setDevnamesID != NULL);
+ CHECK_NULL(AwtPrintControl::setDevnamesID);
+
AwtPrintControl::driverDoesMultipleCopiesID =
env->GetFieldID(cls, "driverDoesMultipleCopies", "Z");
+ DASSERT(AwtPrintControl::driverDoesMultipleCopiesID != NULL);
+ CHECK_NULL(AwtPrintControl::driverDoesMultipleCopiesID);
+
AwtPrintControl::driverDoesCollationID =
env->GetFieldID(cls, "driverDoesCollation", "Z");
+ DASSERT(AwtPrintControl::driverDoesCollationID != NULL);
+ CHECK_NULL(AwtPrintControl::driverDoesCollationID);
+
AwtPrintControl::getCopiesID =
env->GetMethodID(cls, "getCopiesAttrib", "()I");
+ DASSERT(AwtPrintControl::getCopiesID != NULL);
+ CHECK_NULL(AwtPrintControl::getCopiesID);
+
AwtPrintControl::getCollateID =
env->GetMethodID(cls, "getCollateAttrib","()I");
+ DASSERT(AwtPrintControl::getCollateID != NULL);
+ CHECK_NULL(AwtPrintControl::getCollateID);
+
AwtPrintControl::getOrientID =
env->GetMethodID(cls, "getOrientAttrib", "()I");
+ DASSERT(AwtPrintControl::getOrientID != NULL);
+ CHECK_NULL(AwtPrintControl::getOrientID);
+
AwtPrintControl::getFromPageID =
env->GetMethodID(cls, "getFromPageAttrib", "()I");
+ DASSERT(AwtPrintControl::getFromPageID != NULL);
+ CHECK_NULL(AwtPrintControl::getFromPageID);
+
AwtPrintControl::getToPageID =
env->GetMethodID(cls, "getToPageAttrib", "()I");
+ DASSERT(AwtPrintControl::getToPageID != NULL);
+ CHECK_NULL(AwtPrintControl::getToPageID);
+
AwtPrintControl::getMinPageID =
env->GetMethodID(cls, "getMinPageAttrib", "()I");
+ DASSERT(AwtPrintControl::getMinPageID != NULL);
+ CHECK_NULL(AwtPrintControl::getMinPageID);
+
AwtPrintControl::getMaxPageID =
env->GetMethodID(cls, "getMaxPageAttrib", "()I");
+ DASSERT(AwtPrintControl::getMaxPageID != NULL);
+ CHECK_NULL(AwtPrintControl::getMaxPageID);
+
AwtPrintControl::getDestID =
env->GetMethodID(cls, "getDestAttrib", "()Z");
+ DASSERT(AwtPrintControl::getDestID != NULL);
+ CHECK_NULL(AwtPrintControl::getDestID);
+
AwtPrintControl::getQualityID =
env->GetMethodID(cls, "getQualityAttrib", "()I");
+ DASSERT(AwtPrintControl::getQualityID != NULL);
+ CHECK_NULL(AwtPrintControl::getQualityID);
+
AwtPrintControl::getColorID =
env->GetMethodID(cls, "getColorAttrib", "()I");
+ DASSERT(AwtPrintControl::getColorID != NULL);
+ CHECK_NULL(AwtPrintControl::getColorID);
+
AwtPrintControl::getSidesID =
env->GetMethodID(cls, "getSidesAttrib", "()I");
+ DASSERT(AwtPrintControl::getSidesID != NULL);
+ CHECK_NULL(AwtPrintControl::getSidesID);
+
AwtPrintControl::getPrinterID =
env->GetMethodID(cls, "getPrinterAttrib", "()Ljava/lang/String;");
+ DASSERT(AwtPrintControl::getPrinterID != NULL);
+ CHECK_NULL(AwtPrintControl::getPrinterID);
+
AwtPrintControl::getWin32MediaID =
env->GetMethodID(cls, "getWin32MediaAttrib", "()[I");
+ DASSERT(AwtPrintControl::getWin32MediaID != NULL);
+ CHECK_NULL(AwtPrintControl::getWin32MediaID);
+
AwtPrintControl::setWin32MediaID =
env->GetMethodID(cls, "setWin32MediaAttrib", "(III)V");
+ DASSERT(AwtPrintControl::setWin32MediaID != NULL);
+ CHECK_NULL(AwtPrintControl::setWin32MediaID);
+
AwtPrintControl::getWin32MediaTrayID =
env->GetMethodID(cls, "getMediaTrayAttrib", "()I");
+ DASSERT(AwtPrintControl::getWin32MediaTrayID != NULL);
+ CHECK_NULL(AwtPrintControl::getWin32MediaTrayID);
+
AwtPrintControl::setWin32MediaTrayID =
env->GetMethodID(cls, "setMediaTrayAttrib", "(I)V");
+ DASSERT(AwtPrintControl::setWin32MediaTrayID != NULL);
+ CHECK_NULL(AwtPrintControl::setWin32MediaTrayID);
+
AwtPrintControl::getSelectID =
env->GetMethodID(cls, "getSelectAttrib", "()I");
+ DASSERT(AwtPrintControl::getSelectID != NULL);
+ CHECK_NULL(AwtPrintControl::getSelectID);
+
AwtPrintControl::getPrintToFileEnabledID =
env->GetMethodID(cls, "getPrintToFileEnabled", "()Z");
+ DASSERT(AwtPrintControl::getPrintToFileEnabledID != NULL);
+ CHECK_NULL(AwtPrintControl::getPrintToFileEnabledID);
AwtPrintControl::setNativeAttID =
env->GetMethodID(cls, "setNativeAttributes", "(III)V");
+ DASSERT(AwtPrintControl::setNativeAttID != NULL);
+ CHECK_NULL(AwtPrintControl::setNativeAttID);
AwtPrintControl::setRangeCopiesID =
env->GetMethodID(cls, "setRangeCopiesAttribute", "(IIZI)V");
+ DASSERT(AwtPrintControl::setRangeCopiesID != NULL);
+ CHECK_NULL(AwtPrintControl::setRangeCopiesID);
+
AwtPrintControl::setResID =
env->GetMethodID(cls, "setResolutionDPI", "(II)V");
+ DASSERT(AwtPrintControl::setResID != NULL);
+ CHECK_NULL(AwtPrintControl::setResID);
AwtPrintControl::setPrinterID =
env->GetMethodID(cls, "setPrinterNameAttrib", "(Ljava/lang/String;)V");
+ DASSERT(AwtPrintControl::setPrinterID != NULL);
+ CHECK_NULL(AwtPrintControl::setPrinterID);
AwtPrintControl::setJobAttributesID =
env->GetMethodID(cls, "setJobAttributes",
"(Ljavax/print/attribute/PrintRequestAttributeSet;IISSSSSSS)V");
-
- DASSERT(AwtPrintControl::driverDoesMultipleCopiesID != NULL);
- DASSERT(AwtPrintControl::getPrintDCID != NULL);
- DASSERT(AwtPrintControl::setPrintDCID != NULL);
- DASSERT(AwtPrintControl::getDevmodeID != NULL);
- DASSERT(AwtPrintControl::setDevmodeID != NULL);
- DASSERT(AwtPrintControl::getDevnamesID != NULL);
- DASSERT(AwtPrintControl::setDevnamesID != NULL);
- DASSERT(AwtPrintControl::driverDoesCollationID != NULL);
- DASSERT(AwtPrintControl::getWin32MediaID != NULL);
- DASSERT(AwtPrintControl::setWin32MediaID != NULL);
- DASSERT(AwtPrintControl::getWin32MediaTrayID != NULL);
- DASSERT(AwtPrintControl::setWin32MediaTrayID != NULL);
- DASSERT(AwtPrintControl::setRangeCopiesID != NULL);
- DASSERT(AwtPrintControl::setResID != NULL);
- DASSERT(AwtPrintControl::setNativeAttID != NULL);
- DASSERT(AwtPrintControl::dialogOwnerPeerID != NULL);
- DASSERT(AwtPrintControl::getCopiesID != NULL);
- DASSERT(AwtPrintControl::getOrientID != NULL);
- DASSERT(AwtPrintControl::getPrinterID != NULL);
- DASSERT(AwtPrintControl::getCollateID != NULL);
- DASSERT(AwtPrintControl::getFromPageID != NULL);
- DASSERT(AwtPrintControl::getToPageID != NULL);
- DASSERT(AwtPrintControl::getMinPageID != NULL);
- DASSERT(AwtPrintControl::getMaxPageID != NULL);
- DASSERT(AwtPrintControl::getDestID != NULL);
- DASSERT(AwtPrintControl::getQualityID != NULL);
- DASSERT(AwtPrintControl::getColorID != NULL);
- DASSERT(AwtPrintControl::getSidesID != NULL);
- DASSERT(AwtPrintControl::getSelectID != NULL);
- DASSERT(AwtPrintControl::getPrintToFileEnabledID != NULL);
DASSERT(AwtPrintControl::setJobAttributesID != NULL);
-
+ CHECK_NULL(AwtPrintControl::setJobAttributesID);
CATCH_BAD_ALLOC;
}
@@ -606,6 +665,10 @@
LPTSTR getName = (LPTSTR)JNU_GetStringPlatformChars(env,
printerName, NULL);
+ if (getName == NULL) {
+ env->DeleteLocalRef(printerName);
+ throw std::bad_alloc();
+ }
BOOL samePrinter = FALSE;
@@ -652,6 +715,7 @@
if (portName != NULL) {
free(portName);
}
+ env->DeleteLocalRef(printerName);
return FALSE;
}
@@ -664,11 +728,13 @@
if (portName != NULL) {
free(portName);
}
+ env->DeleteLocalRef(printerName);
return FALSE;
}
delete [] buffer;
}
+ env->DeleteLocalRef(printerName);
// PrintDlg may change the values of hDevMode and hDevNames so we
// re-initialize our saved handles.
AwtPrintControl::setPrintHDMode(env, printCtrl, NULL);
--- a/jdk/src/windows/native/sun/windows/awt_PrintDialog.cpp Fri Apr 04 20:18:53 2014 +0400
+++ b/jdk/src/windows/native/sun/windows/awt_PrintDialog.cpp Fri Apr 04 20:26:01 2014 +0400
@@ -193,11 +193,24 @@
// as peer object is used later on another thread, create a global ref
jobject peerGlobalRef = env->NewGlobalRef(peer);
DASSERT(peerGlobalRef != NULL);
+ CHECK_NULL_RETURN(peerGlobalRef, 0);
jobject target = env->GetObjectField(peerGlobalRef, AwtObject::targetID);
DASSERT(target != NULL);
+ if (target == NULL) {
+ env->DeleteGlobalRef(peerGlobalRef);
+ return 0;
+ }
jobject parent = env->GetObjectField(peerGlobalRef, AwtPrintDialog::parentID);
jobject control = env->GetObjectField(target, AwtPrintDialog::controlID);
DASSERT(control != NULL);
+ if (control == NULL) {
+ env->DeleteGlobalRef(peerGlobalRef);
+ env->DeleteLocalRef(target);
+ if (parent != NULL) {
+ env->DeleteLocalRef(parent);
+ }
+ return 0;
+ }
AwtComponent *awtParent = (parent != NULL) ? (AwtComponent *)JNI_GET_PDATA(parent) : NULL;
HWND hwndOwner = awtParent ? awtParent->GetHWnd() : NULL;
@@ -206,7 +219,18 @@
memset(&pd, 0, sizeof(PRINTDLG));
pd.lStructSize = sizeof(PRINTDLG);
pd.lCustData = (LPARAM)peerGlobalRef;
- BOOL ret = AwtPrintControl::InitPrintDialog(env, control, pd);
+ BOOL ret;
+ try {
+ ret = AwtPrintControl::InitPrintDialog(env, control, pd);
+ } catch (std::bad_alloc&) {
+ env->DeleteGlobalRef(peerGlobalRef);
+ env->DeleteLocalRef(target);
+ if (parent != NULL) {
+ env->DeleteLocalRef(parent);
+ }
+ env->DeleteLocalRef(control);
+ throw;
+ }
if (!ret) {
/* Couldn't use the printer, or spooler isn't running
* Call Page dialog with ' PD_RETURNDEFAULT' so it doesn't try