}
int
-do_exists (const char *path)
-{
- int r;
-
- CHROOT_IN;
- r = access (path, F_OK);
- CHROOT_OUT;
-
- return r == 0;
-}
-
-int
-do_is_file (const char *path)
+do_write_file (const char *path, const char *content, int size)
{
- int r;
- struct stat buf;
-
- CHROOT_IN;
- r = lstat (path, &buf);
- CHROOT_OUT;
+ int fd;
- if (r == -1) {
- if (errno != ENOENT && errno != ENOTDIR) {
- reply_with_perror ("stat: %s", path);
- return -1;
- }
- else
- return 0; /* Not a file. */
+ /* This call is deprecated, and it has a broken interface. New code
+ * should use the 'guestfs_write' call instead. Because we used an
+ * XDR string type, 'content' cannot contain ASCII NUL and 'size'
+ * must never be longer than the string. We must check this to
+ * ensure random stuff from XDR or daemon memory isn't written to
+ * the file (RHBZ#597135).
+ */
+ if (size < 0) {
+ reply_with_error ("size cannot be negative");
+ return -1;
}
- return S_ISREG (buf.st_mode);
-}
-
-int
-do_write_file (const char *path, const char *content, int size)
-{
- int fd;
+ /* Note content_len must be small because of the limits on protocol
+ * message size.
+ */
+ int content_len = (int) strlen (content);
if (size == 0)
- size = strlen (content);
+ size = content_len;
+ else if (size > content_len) {
+ reply_with_error ("size parameter is larger than string content");
+ return -1;
+ }
CHROOT_IN;
fd = open (path, O_WRONLY | O_TRUNC | O_CREAT | O_NOCTTY, 0666);