2007-02-09 Sebastien Pouliot <sebastien@ximian.com>
authorSebastien Pouliot <sebastien@ximian.com>
Fri, 9 Feb 2007 14:19:48 +0000 (14:19 -0000)
committerSebastien Pouliot <sebastien@ximian.com>
Fri, 9 Feb 2007 14:19:48 +0000 (14:19 -0000)
* PrintingServicesUnix.cs: Ensure we free the original pointer in
GetAlternativeDefaultPrinter (not the one used for iteration).

svn path=/trunk/mcs/; revision=72542

mcs/class/System.Drawing/System.Drawing.Printing/ChangeLog
mcs/class/System.Drawing/System.Drawing.Printing/PrintingServicesUnix.cs

index 1a2d5ddb38fbb8a91154ea0f8b11d4b0fccb0864..9d19750b7d2a07f91e3f1abec4d2c54ae779646f 100644 (file)
@@ -1,3 +1,8 @@
+2007-02-09  Sebastien Pouliot  <sebastien@ximian.com>
+
+       * PrintingServicesUnix.cs: Ensure we free the original pointer in
+       GetAlternativeDefaultPrinter (not the one used for iteration).
+
 2007-01-19  Andreia Gaita  <avidigal@novell.com>
 
        * PrintingServicesUnix.cs: Add is_default flag check for 
index 64c3f8d04d2a9d3960c2f68c3d8253c8b500c3e7..bc7e4259d3224a952b1b70c699ab8721b21dcdbd 100644 (file)
@@ -1,5 +1,5 @@
 //
-// Copyright (C) 2005 Novell, Inc. http://www.novell.com
+// Copyright (C) 2005, 2007 Novell, Inc. http://www.novell.com
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -362,26 +362,29 @@ namespace System.Drawing.Printing
                /// returns the first one. See #80519, #80198\r
                /// </summary>\r
                /// <returns></returns>
-               private string GetAlternativeDefaultPrinter() {
+               private string GetAlternativeDefaultPrinter ()
+               {
                        IntPtr printers = IntPtr.Zero;
-                       CUPS_DESTS printer;
                        string printer_name = String.Empty;
 
-                       int cups_dests_size = Marshal.SizeOf(typeof(CUPS_DESTS));
-
                        int printer_count = cupsGetDests (ref printers);
-
-                       for (int i = 0; i < printer_count; i++) {
-                               printer = (CUPS_DESTS) Marshal.PtrToStructure (printers, typeof (CUPS_DESTS));
-
-                               if (printer.is_default != 0 || printer_name.Equals(String.Empty)) {
-                                       printer_name = Marshal.PtrToStringAnsi (printer.name);
-                                       if (printer.is_default != 0)
-                                               break;
+                       try {
+                               int cups_dests_size = Marshal.SizeOf (typeof (CUPS_DESTS));
+                               IntPtr current = printers;
+                               for (int i = 0; i < printer_count; i++) {
+                                       CUPS_DESTS printer = (CUPS_DESTS) Marshal.PtrToStructure (current, typeof (CUPS_DESTS));
+
+                                       if ((printer.is_default != 0) || (printer_name.Length == 0)) {
+                                               printer_name = Marshal.PtrToStringAnsi (printer.name);
+                                               if (printer.is_default != 0)
+                                                       break;
+                                       }
+                                       current = new IntPtr (current.ToInt64 () + cups_dests_size);
                                }
-                               printers = new IntPtr (printers.ToInt64 () + cups_dests_size);
                        }
-                       Marshal.FreeHGlobal (printers);
+                       finally {
+                               Marshal.FreeHGlobal (printers);
+                       }
 
                        return printer_name;
                }