[prev in list] [next in list] [prev in thread] [next in thread]
List: openjdk-awt-dev
Subject: Re: <AWT Dev> RFR: 8181571: printing to CUPS fails on mac sandbox app [v3]
From: Alexander Scherbatiy <alexsch () openjdk ! java ! net>
Date: 2021-08-24 16:34:30
Message-ID: Noj7YW0DvwQOOW-6mjfJzKzVCAro-5AccwCLjQ9A4ZY=.5475f0c7-82cb-4015-9a97-b8f444c1657e () github ! com
[Download RAW message or body]
On Thu, 12 Aug 2021 19:34:44 GMT, Phil Race <prr@openjdk.org> wrote:
> > Alexander Scherbatiy has updated the pull request incrementally with one \
> > additional commit since the last revision:
> > Return null if printers are not found in sandboxed app on MacOS
>
> src/java.desktop/unix/classes/sun/print/CUPSPrinter.java line 96:
>
> > 94: libFound = initIDs();
> > 95: if (libFound) {
> > 96: cupsServer = getCupsServer();
>
> I think we should wrap all the new lines in isMac()
> Also can you explain the reasons for the logic that implies we may have a server \
> starting with "/" in which case your always change the cupServer to localhost even \
> if it is not sandboxed ?
> I ask because it seems to contradict what you pasted
> "by the cupsServer() function and not changing the interface string to "localhost""
The logic which replaces a server starting with "/" to localhost is the original \
logic which is implemented in native level in the getCupsServer() function: \
https://github.com/openjdk/jdk/blob/f608e81ad8309a001b8a92563a93b8adee1ce2b8/src/java.desktop/unix/native/common/awt/CUPSfuncs.c#L176
The fix only moves this logic to the java level to store domainSocketPathname in \
case of sandboxed app on MacOS.
> src/java.desktop/unix/classes/sun/print/CUPSPrinter.java line 399:
>
> > 397: return printerURIs;
> > 398: }
> > 399: }
>
> So if getCupsDefaultPrinters() doesn't find anything you always continue to the \
> original code even though it would seem that you know we are in a sandboxed app and \
> it won't find anything ?
I updated the code to return null in case there are no printer names from \
j2d_cupsGetDests() function in a sandboxed on MacOS.
> src/java.desktop/unix/classes/sun/print/CUPSPrinter.java line 489:
>
> > 487: return domainSocketPathname;
> > 488: }
> > 489:
>
> You will need to suppress deprecation warnings here.
Should I add `@SuppressWarnings("deprecation")` to the getDomainSocketPathname() \
method? I see that CUPSPrinter class has `@SuppressWarnings("removal")` but its \
private method do not have any SuppressWarnings annotations.
> src/java.desktop/unix/classes/sun/print/CUPSPrinter.java line 506:
>
> > 504: IPPPrintService.debug_println(debugPrefix+"libFound "+libFound);
> > 505: if (libFound) {
> > 506: String server = getDomainSocketPathname() != null ? \
> > getDomainSocketPathname() : getServer();
>
> Split this long line
Updated.
> src/java.desktop/unix/native/common/awt/CUPSfuncs.c line 244:
>
> > 242: DPRINTF("CUPSfuncs::bad alloc new array\n", "")
> > 243: (*env)->ExceptionClear(env);
> > 244: JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
>
> I find this weird. What is the ExceptionClear for ? The only possible exception \
> here is for an OOME which might be thrown by NewObjectArray. So you clear that and \
> then re-create it ? And who do will catch this ? What's the point ? Maybe just \
> clear and return null.
The array creation error handling is implemented in the similar way as it is done in \
the getMedia() function. The ExceptionClear() has been added to the getMedia() by \
`8031001: [Parfait] warnings from b121 for jdk/src/solaris/native/sun/awt: \
JNI-related warnings` I would prefer to have unified error handling in these methods. \
If ExceptionClear is not suitable in this place it would be better to recheck \
JDK-8031001 and update all places accordingly in a separate fix.
> src/java.desktop/unix/native/common/awt/CUPSfuncs.c line 253:
>
> > 251: j2d_cupsFreeDests(num_dests, dests);
> > 252: DPRINTF("CUPSfuncs::bad alloc new string ->name\n", "")
> > 253: JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
>
> similar comments to above plus I am fairly sure you want to delete nameArray since \
> it isn't returned. For that matter if the NewString fails on the 4th printer you \
> want to free the 3 previous ones too before returning.
The code is updated to remove previously created strings and clear the nameArray in \
case of an error during new string creation.
-------------
PR: https://git.openjdk.java.net/jdk/pull/4861
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic