inkscape/inkscape-0.46pre1-ocal1.patch
2008-02-14 17:03:26 +00:00

140 lines
5.1 KiB
Diff

This solves the insecure temporary file usage for clip art thumbnails,
however in a totally crappy way -- leaves stale files in /tmp.
Not much worse than original though, as it was also leaving the files in place.
Lubomir Kundrak <lkundrak@redhat.com>
diff -urp inkscape-0.45.1+0.46pre1.orig/src/ui/dialog/ocaldialogs.cpp inkscape-0.45.1+0.46pre1/src/ui/dialog/ocaldialogs.cpp
--- inkscape-0.45.1+0.46pre1.orig/src/ui/dialog/ocaldialogs.cpp 2008-01-15 00:24:56.000000000 +0100
+++ inkscape-0.45.1+0.46pre1/src/ui/dialog/ocaldialogs.cpp 2008-02-14 15:53:00.000000000 +0100
@@ -14,6 +14,8 @@
# include <config.h>
#endif
+#include <stdlib.h>
+
#include "ocaldialogs.h"
#include "filedialogimpl-gtkmm.h"
#include "interface.h"
@@ -260,23 +262,35 @@ FileExportToOCALPasswordDialog::change_t
void FileListViewText::on_cursor_changed()
{
// create file path
- myFilename = Glib::get_tmp_dir();
- myFilename.append(G_DIR_SEPARATOR_S);
std::vector<Gtk::TreeModel::Path> pathlist;
pathlist = this->get_selection()->get_selected_rows();
std::vector<int> posArray(1);
posArray = pathlist[0].get_indices();
- myFilename.append(get_text(posArray[0], 2));
#ifdef WITH_GNOME_VFS
gnome_vfs_init();
GnomeVFSHandle *from_handle = NULL;
- GnomeVFSHandle *to_handle = NULL;
+ int to_fd = 0;
GnomeVFSFileSize bytes_read;
- GnomeVFSFileSize bytes_written;
+ size_t bytes_written;
GnomeVFSResult result;
guint8 buffer[8192];
+ // create the temp file
+ myFilename = Glib::get_tmp_dir();
+ myFilename.append(G_DIR_SEPARATOR_S);
+ myFilename.append("XXXXXX");
+
+ char tmpfn[strlen (myFilename.c_str ())+1];
+ strcpy (tmpfn, myFilename.c_str ());
+ to_fd = mkstemp (tmpfn);
+ myFilename = tmpfn;
+
+ if (to_fd == -1) {
+ sp_ui_error_dialog(_("Could not create temp file name with unique name."));
+ return;
+ }
+
//get file url
Glib::ustring fileUrl = get_text(posArray[0], 1); //http url
@@ -290,51 +304,42 @@ void FileListViewText::on_cursor_changed
if (!Glib::get_charset()) //If we are not utf8
fileUrl = Glib::filename_to_utf8(fileUrl);
- // verifies if the file wasn't previously downloaded
- if(gnome_vfs_open(&to_handle, myFilename.c_str(), GNOME_VFS_OPEN_READ) == GNOME_VFS_ERROR_NOT_FOUND)
- {
- // open the temp file to receive
- result = gnome_vfs_open (&to_handle, myFilename.c_str(), GNOME_VFS_OPEN_WRITE);
- if (result == GNOME_VFS_ERROR_NOT_FOUND){
- result = gnome_vfs_create (&to_handle, myFilename.c_str(), GNOME_VFS_OPEN_WRITE, FALSE, GNOME_VFS_PERM_USER_ALL);
+ result = gnome_vfs_open (&from_handle, fileUrl.c_str(), GNOME_VFS_OPEN_READ);
+ if (result != GNOME_VFS_OK) {
+ sp_ui_error_dialog(_("Could not find the file in Open Clip Art Library."));
+ g_warning("%s", gnome_vfs_result_to_string(result));
+ return;
+ }
+
+ // copy the file
+ while (1) {
+
+ result = gnome_vfs_read (from_handle, buffer, 8192, &bytes_read);
+
+ if ((result == GNOME_VFS_ERROR_EOF) &&(!bytes_read)){
+ result = gnome_vfs_close (from_handle);
+ break;
}
+
if (result != GNOME_VFS_OK) {
- g_warning("Error creating temp file: %s", gnome_vfs_result_to_string(result));
+ sp_ui_error_dialog(_("Error while downloading the file."));
+ g_warning("%s", gnome_vfs_result_to_string(result));
return;
}
- result = gnome_vfs_open (&from_handle, fileUrl.c_str(), GNOME_VFS_OPEN_READ);
- if (result != GNOME_VFS_OK) {
- g_warning("Could not find the file in Open Clip Art Library.");
+
+ bytes_written = write (to_fd, buffer, (size_t)bytes_read);
+
+ if ((size_t)bytes_read != bytes_written){
+ sp_ui_error_dialog(_("Error while downloading the file."));
+ g_warning("Bytes read not equal to bytes written");
return;
}
- // copy the file
- while (1) {
- result = gnome_vfs_read (from_handle, buffer, 8192, &bytes_read);
- if ((result == GNOME_VFS_ERROR_EOF) &&(!bytes_read)){
- result = gnome_vfs_close (from_handle);
- result = gnome_vfs_close (to_handle);
- break;
- }
- if (result != GNOME_VFS_OK) {
- g_warning("%s", gnome_vfs_result_to_string(result));
- return;
- }
- result = gnome_vfs_write (to_handle, buffer, bytes_read, &bytes_written);
- if (result != GNOME_VFS_OK) {
- g_warning("%s", gnome_vfs_result_to_string(result));
- return;
- }
- if (bytes_read != bytes_written){
- g_warning("Bytes read not equal to bytes written");
- return;
- }
- }
- }
- else
- {
- gnome_vfs_close(to_handle);
+
}
+
+ close (to_fd);
myPreview->showImage(myFilename);
+ //unlink (myFilename.c_str ());
myLabel->set_text(get_text(posArray[0], 4));
#endif
}