public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
* [SCM]  master: Overload = and copy in element classes; prevents copy leading to double free.
@ 2008-05-21 18:12 cagney
  0 siblings, 0 replies; only message in thread
From: cagney @ 2008-05-21 18:12 UTC (permalink / raw)
  To: frysk-cvs

The branch, master has been updated
       via  ac46ba63440998b66f7038c8fe0efad8036186ff (commit)
      from  14acd83ef32ae48dfd81962026102a522edb1931 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit ac46ba63440998b66f7038c8fe0efad8036186ff
Author: Andrew Cagney <cagney@redhat.com>
Date:   Wed May 21 14:09:56 2008 -0400

    Overload = and copy in element classes; prevents copy leading to double free.
    
    frysk-sys/frysk/sys/ChangeLog
    2008-05-21  Andrew Cagney  <cagney@redhat.com>
    
    	* jni/Fork.cxx (spawn): Use elements(), not .p.
    	* jni/Signal.cxx-sh (frysk): Ditto.
    
    frysk-sys/frysk/sys/proc/ChangeLog
    2008-05-21  Andrew Cagney  <cagney@redhat.com>
    
    	* jni/AuxvBuilder.cxx (verify): Use length() and elements().
    	* jni/Stat.cxx (Stat::scan): Ditto.
    	* jni/MapsBuilder.cxx (construct): Ditto.
    	* jni/CmdLineBuilder.cxx (construct): Ditto.
    	* jni/Status.cxx (Status::scan): Ditto.
    
    frysk-sys/frysk/sys/ptrace/ChangeLog
    2008-05-21  Andrew Cagney  <cagney@redhat.com>
    
    	* jni/AddressSpace.cxx (AddressSpace::transfer): Use elements().
    	* jni/RegisterSet.cxx (RegisterSet::transfer): Ditto.
    
    frysk-sys/jnixx/ChangeLog
    2008-05-21  Andrew Cagney  <cagney@redhat.com>
    
    	* elements.hxx (class StringChars): Implement operator=, copy
    	constructor, add elements(), rename free() to release().
    	(class StringArrayChars): Ditto.
    	(class Bytes): Add virtual elements() and length(), operator= and
    	copy constructor.
    	(class FileBytes): Implement.
    	(class ArrayBytes): Implement.
    	* elements.cxx (FileBytes::FileBytes): Update.
    	* Native.java (throwElements): New.
    	* TestJnixx.java (testElementRelease()): New.
    	* jni/Native.cxx (Native::throwElements): New.
    	* cni/Native.cxx (Native::throwElements): New.
    	* jni/Native.cxx (Native::throwElements): New.

-----------------------------------------------------------------------

Summary of changes:
 frysk-sys/frysk/sys/ChangeLog                   |    5 +
 frysk-sys/frysk/sys/jni/Fork.cxx                |   15 ++-
 frysk-sys/frysk/sys/jni/Signal.cxx-sh           |    4 +-
 frysk-sys/frysk/sys/proc/ChangeLog              |    8 ++
 frysk-sys/frysk/sys/proc/jni/AuxvBuilder.cxx    |   16 ++--
 frysk-sys/frysk/sys/proc/jni/CmdLineBuilder.cxx |   12 +-
 frysk-sys/frysk/sys/proc/jni/MapsBuilder.cxx    |   10 +-
 frysk-sys/frysk/sys/proc/jni/Stat.cxx           |    6 +-
 frysk-sys/frysk/sys/proc/jni/Status.cxx         |    6 +-
 frysk-sys/frysk/sys/ptrace/ChangeLog            |    5 +
 frysk-sys/frysk/sys/ptrace/jni/AddressSpace.cxx |    4 +-
 frysk-sys/frysk/sys/ptrace/jni/RegisterSet.cxx  |    2 +-
 frysk-sys/jnixx/ChangeLog                       |   16 +++
 frysk-sys/jnixx/Native.java                     |    3 +
 frysk-sys/jnixx/TestJnixx.java                  |   13 ++
 frysk-sys/jnixx/cni/Native.cxx                  |    7 +
 frysk-sys/jnixx/elements.cxx                    |  113 +++++++++++--------
 frysk-sys/jnixx/elements.hxx                    |  135 ++++++++++++++++++-----
 frysk-sys/jnixx/jni/Native.cxx                  |   26 +++++
 19 files changed, 292 insertions(+), 114 deletions(-)

First 500 lines of diff:
diff --git a/frysk-sys/frysk/sys/ChangeLog b/frysk-sys/frysk/sys/ChangeLog
index 22e3cb0..c6f46b9 100644
--- a/frysk-sys/frysk/sys/ChangeLog
+++ b/frysk-sys/frysk/sys/ChangeLog
@@ -1,3 +1,8 @@
+2008-05-21  Andrew Cagney  <cagney@redhat.com>
+
+	* jni/Fork.cxx (spawn): Use elements(), not .p.
+	* jni/Signal.cxx-sh (frysk): Ditto.
+
 2008-05-20  Andrew Cagney  <cagney@redhat.com>
 
 	* jni/Signal.cxx-sh: Don't leak JNI string pointers.
diff --git a/frysk-sys/frysk/sys/jni/Fork.cxx b/frysk-sys/frysk/sys/jni/Fork.cxx
index 9a4e5f2..83b23c1 100644
--- a/frysk-sys/frysk/sys/jni/Fork.cxx
+++ b/frysk-sys/frysk/sys/jni/Fork.cxx
@@ -168,13 +168,14 @@ spawn(jnixx::env env, java::io::File exe,
   StringChars errPath = StringChars(env, err);
   int argc = args.GetArrayLength(env);
   StringArrayChars argv = StringArrayChars(env, args);
-  int pid = ::spawn(exePath.p, inPath.p, outPath.p, errPath.p,
-		    argc, argv.p, (char**)environ, trace);
-  argv.free();
-  exePath.free();
-  inPath.free();
-  outPath.free();
-  errPath.free();
+  int pid = ::spawn(exePath.elements(),
+		    inPath.elements(), outPath.elements(), errPath.elements(),
+		    argc, argv.elements(), (char**)environ, trace);
+  argv.release();
+  exePath.release();
+  inPath.release();
+  outPath.release();
+  errPath.release();
   if (pid < 0) {
     switch (trace) {
     case NO_TRACE:
diff --git a/frysk-sys/frysk/sys/jni/Signal.cxx-sh b/frysk-sys/frysk/sys/jni/Signal.cxx-sh
index feb62e8..f9744ce 100644
--- a/frysk-sys/frysk/sys/jni/Signal.cxx-sh
+++ b/frysk-sys/frysk/sys/jni/Signal.cxx-sh
@@ -73,8 +73,8 @@ frysk::sys::Signal::tkill(::jnixx::env env, jint tid, jint sig,
   if (::syscall(__NR_tkill, tid, sig) < 0) {
     StringChars sname = StringChars(env, name);
     errnoException(env, errno, "tkill", "task %d, signal %s (%d)",
-    		   tid, sname.p, sig);
-    sname.free(); // happens during unwind
+    		   tid, sname.elements(), sig);
+    sname.release(); // happens during unwind
   }
 }
 
diff --git a/frysk-sys/frysk/sys/proc/ChangeLog b/frysk-sys/frysk/sys/proc/ChangeLog
index c88c933..fd90b11 100644
--- a/frysk-sys/frysk/sys/proc/ChangeLog
+++ b/frysk-sys/frysk/sys/proc/ChangeLog
@@ -1,3 +1,11 @@
+2008-05-21  Andrew Cagney  <cagney@redhat.com>
+
+	* jni/AuxvBuilder.cxx (verify): Use length() and elements().
+	* jni/Stat.cxx (Stat::scan): Ditto.
+	* jni/MapsBuilder.cxx (construct): Ditto.
+	* jni/CmdLineBuilder.cxx (construct): Ditto.
+	* jni/Status.cxx (Status::scan): Ditto.
+
 2008-05-20  Andrew Cagney  <cagney@redhat.com>
 
 	* jni/Status.cxx: Implement.
diff --git a/frysk-sys/frysk/sys/proc/jni/AuxvBuilder.cxx b/frysk-sys/frysk/sys/proc/jni/AuxvBuilder.cxx
index a0b957f..a0fc849 100644
--- a/frysk-sys/frysk/sys/proc/jni/AuxvBuilder.cxx
+++ b/frysk-sys/frysk/sys/proc/jni/AuxvBuilder.cxx
@@ -98,10 +98,10 @@ static bool
 verify(Bytes& buf, get_t *get) {
   int wordSize = abs (get (NULL));
   // Buffer holds an exact multiple of entry-size (2*word)?
-  if (buf.length % (wordSize * 2) != 0)
+  if (buf.length() % (wordSize * 2) != 0)
     return false;
-  for (int i = 0; i < buf.length; i += 2 * wordSize) {
-    jbyte *p = buf.elements + i;
+  for (int i = 0; i < buf.length(); i += 2 * wordSize) {
+    jbyte *p = buf.elements() + i;
     int64_t type = get (p);
     // Reasonable value?
     if (type > 1024 || type < 0)
@@ -112,9 +112,9 @@ verify(Bytes& buf, get_t *get) {
     // on 64-bit arch, there's one AT_NULL at the end of auxv vector.
     // However, there's 3 AT_NULL for 32-bit application on 64-bit arch.
     if (type == 0) {
-        if ((i + 2 * wordSize) == buf.length)
+        if ((i + 2 * wordSize) == buf.length())
           return true;
-        else if ((i + (2 * wordSize) * 3)  == buf.length)
+        else if ((i + (2 * wordSize) * 3)  == buf.length())
           return true;
         else
           return false;
@@ -167,12 +167,12 @@ construct(jnixx::env env, AuxvBuilder builder, Bytes& buf) {
 
   int wordSize = abs(get (NULL));
   bool bigEndian = get(NULL) > 0;
-  int numberEntries = buf.length / wordSize / 2;
+  int numberEntries = buf.length() / wordSize / 2;
   builder.buildDimensions(env, wordSize, bigEndian, numberEntries);
   
   // Unpack the corresponding entries.
   for (int i = 0; i < numberEntries; i++) {
-    jbyte *p = buf.elements + wordSize * i * 2;
+    jbyte *p = buf.elements() + wordSize * i * 2;
     jint type = get(p + wordSize * 0);
     jlong value = get(p + wordSize * 1);
     builder.buildAuxiliary(env, i, type, value);
@@ -184,7 +184,7 @@ construct(jnixx::env env, AuxvBuilder builder, Bytes& buf) {
 bool
 AuxvBuilder::construct(jnixx::env env, jint pid) {
   FileBytes bytes = FileBytes(env, "/proc/%d/auxv", pid);
-  if (bytes.elements == NULL)
+  if (bytes.elements() == NULL)
     return false;
   bool ok = ::construct(env, *this, bytes);
   bytes.release();
diff --git a/frysk-sys/frysk/sys/proc/jni/CmdLineBuilder.cxx b/frysk-sys/frysk/sys/proc/jni/CmdLineBuilder.cxx
index 8a432db..fc150ed 100644
--- a/frysk-sys/frysk/sys/proc/jni/CmdLineBuilder.cxx
+++ b/frysk-sys/frysk/sys/proc/jni/CmdLineBuilder.cxx
@@ -49,8 +49,8 @@ construct(jnixx::env env, frysk::sys::proc::CmdLineBuilder* builder,
 	  Bytes& bytes) {
   // Count the number of parameters.
   int argc = 0;
-  for (int i = 0; i < bytes.length; i++) {
-    if (bytes.elements[i] == '\0')
+  for (int i = 0; i < bytes.length(); i++) {
+    if (bytes.elements()[i] == '\0')
       argc++;
   }
 
@@ -61,9 +61,9 @@ construct(jnixx::env env, frysk::sys::proc::CmdLineBuilder* builder,
   // Copy over the strings.
   int start = 0;
   argc = 0;
-  for (int i = 0; i < bytes.length; i++) {
-    if (bytes.elements[i] == '\0') {
-      argv.SetObjectArrayElement(env, argc, String::NewStringUTF(env, (const char*)bytes.elements + start));
+  for (int i = 0; i < bytes.length(); i++) {
+    if (bytes.elements()[i] == '\0') {
+      argv.SetObjectArrayElement(env, argc, String::NewStringUTF(env, (const char*)bytes.elements() + start));
       start = i + 1;
       argc++;
     }
@@ -75,7 +75,7 @@ construct(jnixx::env env, frysk::sys::proc::CmdLineBuilder* builder,
 bool
 frysk::sys::proc::CmdLineBuilder::construct(jnixx::env env, jint pid) {
   FileBytes bytes = FileBytes(env, pid, "cmdline");
-  if (bytes.elements == NULL)
+  if (bytes.elements() == NULL)
     return false;
   bool ok = ::construct(env, this, bytes);
   bytes.release();
diff --git a/frysk-sys/frysk/sys/proc/jni/MapsBuilder.cxx b/frysk-sys/frysk/sys/proc/jni/MapsBuilder.cxx
index 462da09..4c543da 100644
--- a/frysk-sys/frysk/sys/proc/jni/MapsBuilder.cxx
+++ b/frysk-sys/frysk/sys/proc/jni/MapsBuilder.cxx
@@ -50,8 +50,8 @@
 
 bool
 construct(jnixx::env env, frysk::sys::proc::MapsBuilder* builder, Bytes& buf) {
-  const char *start = (const char *) buf.elements;
-  const char *end = start + buf.length;
+  const char *start = (const char *) buf.elements();
+  const char *end = start + buf.length();
   const char *p = start;
   while (p < end) {
     if (isspace (*p))
@@ -111,12 +111,12 @@ frysk::sys::proc::MapsBuilder::construct(jnixx::env env, jnixx::byteArray buf) {
 bool
 frysk::sys::proc::MapsBuilder::construct(jnixx::env env, jint pid) {
   FileBytes bytes = FileBytes(env, pid, "maps");
-  if (bytes.elements == NULL)
+  if (bytes.elements() == NULL)
     return false;
   {
-    jnixx::byteArray array = jnixx::byteArray::NewByteArray(env, bytes.length);
+    jnixx::byteArray array = jnixx::byteArray::NewByteArray(env, bytes.length());
     ArrayBytes b = ArrayBytes(env, array);
-    memcpy(b.elements, bytes.elements, bytes.length);
+    memcpy(b.elements(), bytes.elements(), bytes.length());
     b.release();
     buildBuffer(env, array);
     array.DeleteLocalRef(env);
diff --git a/frysk-sys/frysk/sys/proc/jni/Stat.cxx b/frysk-sys/frysk/sys/proc/jni/Stat.cxx
index df0e85a..e14e2f7 100644
--- a/frysk-sys/frysk/sys/proc/jni/Stat.cxx
+++ b/frysk-sys/frysk/sys/proc/jni/Stat.cxx
@@ -131,9 +131,9 @@ frysk::sys::proc::Stat::scan(jnixx::env env, jint procPid, jint threadTid) {
 frysk::sys::proc::Stat
 frysk::sys::proc::Stat::scan(jnixx::env env, jint procPid) {
   FileBytes bytes = FileBytes(env, procPid, "stat");
-  if (bytes.elements == NULL)
+  if (bytes.elements() == NULL)
     return Stat(env, NULL);
-  ::scan(env, (const char*) bytes.elements, *this, GetFine(env));
+  ::scan(env, (const char*) bytes.elements(), *this, GetFine(env));
   bytes.release();
   return *this;
 }
@@ -141,7 +141,7 @@ frysk::sys::proc::Stat::scan(jnixx::env env, jint procPid) {
 frysk::sys::proc::Stat
 frysk::sys::proc::Stat::scan(jnixx::env env, jnixx::byteArray buf) {
   ArrayBytes bytes = ArrayBytes(env, buf);
-  ::scan(env, (const char*) bytes.elements, *this, GetFine(env));
+  ::scan(env, (const char*) bytes.elements(), *this, GetFine(env));
   bytes.release();
   return *this;
 }
diff --git a/frysk-sys/frysk/sys/proc/jni/Status.cxx b/frysk-sys/frysk/sys/proc/jni/Status.cxx
index 8aae8d4..fe094d9 100644
--- a/frysk-sys/frysk/sys/proc/jni/Status.cxx
+++ b/frysk-sys/frysk/sys/proc/jni/Status.cxx
@@ -115,9 +115,9 @@ scan(jnixx::env env, const char *p, Status status, frysk::rsl::Log fine) {
 Status
 Status::scan(jnixx::env env, jint pid) {
   FileBytes bytes = FileBytes(env, pid, "status");
-  if (bytes.elements == NULL)
+  if (bytes.elements() == NULL)
     return Status(env, NULL);
-  Status s = ::scan(env, (const char*)bytes.elements, *this, GetFine(env));
+  Status s = ::scan(env, (const char*)bytes.elements(), *this, GetFine(env));
   bytes.release();
   return s;
 }
@@ -125,7 +125,7 @@ Status::scan(jnixx::env env, jint pid) {
 Status
 Status::scan(jnixx::env env, jnixx::byteArray buf) {
   ArrayBytes bytes = ArrayBytes(env, buf);
-  Status s = ::scan(env, (const char*)bytes.elements, *this, GetFine(env));
+  Status s = ::scan(env, (const char*)bytes.elements(), *this, GetFine(env));
   bytes.release();
   return s;
 }
diff --git a/frysk-sys/frysk/sys/ptrace/ChangeLog b/frysk-sys/frysk/sys/ptrace/ChangeLog
index 4457863..687762e 100644
--- a/frysk-sys/frysk/sys/ptrace/ChangeLog
+++ b/frysk-sys/frysk/sys/ptrace/ChangeLog
@@ -1,3 +1,8 @@
+2008-05-21  Andrew Cagney  <cagney@redhat.com>
+
+	* jni/AddressSpace.cxx (AddressSpace::transfer): Use elements().
+	* jni/RegisterSet.cxx (RegisterSet::transfer): Ditto.
+
 2008-05-20  Andrew Cagney  <cagney@redhat.com>
 
 	* jni/AddressSpace.cxx: Update; ByteArrayElements renamed to
diff --git a/frysk-sys/frysk/sys/ptrace/jni/AddressSpace.cxx b/frysk-sys/frysk/sys/ptrace/jni/AddressSpace.cxx
index f78df28..a74c716 100644
--- a/frysk-sys/frysk/sys/ptrace/jni/AddressSpace.cxx
+++ b/frysk-sys/frysk/sys/ptrace/jni/AddressSpace.cxx
@@ -149,9 +149,9 @@ frysk::sys::ptrace::AddressSpace::transfer(::jnixx::env env,
     // extract or modify
     ArrayBytes bytes = ArrayBytes(env, byteArray);
     if (op == ptPeek)
-      memcpy(offset + i + bytes.elements, &w.b[woff], wlen);
+      memcpy(offset + i + bytes.elements(), &w.b[woff], wlen);
     else {
-      memcpy(&w.b[woff], offset + i + bytes.elements, wlen);
+      memcpy(&w.b[woff], offset + i + bytes.elements(), wlen);
 #if DEBUG
       fprintf(stderr, " poke 0x%lx", w.l);
 #endif
diff --git a/frysk-sys/frysk/sys/ptrace/jni/RegisterSet.cxx b/frysk-sys/frysk/sys/ptrace/jni/RegisterSet.cxx
index 5aa1d04..6d09673 100644
--- a/frysk-sys/frysk/sys/ptrace/jni/RegisterSet.cxx
+++ b/frysk-sys/frysk/sys/ptrace/jni/RegisterSet.cxx
@@ -56,7 +56,7 @@ frysk::sys::ptrace::RegisterSet::transfer(::jnixx::env env,
 					  jint length) {
   verifyBounds(env, data, length);
   ArrayBytes bytes = ArrayBytes(env, data);
-  ptraceOp(env, op, pid, NULL, (long) bytes.elements);
+  ptraceOp(env, op, pid, NULL, (long) bytes.elements());
   bytes.release();
 }
 
diff --git a/frysk-sys/jnixx/ChangeLog b/frysk-sys/jnixx/ChangeLog
index 1125275..f4c0d71 100644
--- a/frysk-sys/jnixx/ChangeLog
+++ b/frysk-sys/jnixx/ChangeLog
@@ -1,3 +1,19 @@
+2008-05-21  Andrew Cagney  <cagney@redhat.com>
+
+	* elements.hxx (class StringChars): Implement operator=, copy
+	constructor, add elements(), rename free() to release().
+	(class StringArrayChars): Ditto.
+	(class Bytes): Add virtual elements() and length(), operator= and
+	copy constructor.
+	(class FileBytes): Implement.
+	(class ArrayBytes): Implement.
+	* elements.cxx (FileBytes::FileBytes): Update.
+	* Native.java (throwElements): New.
+	* TestJnixx.java (testElementRelease()): New.
+	* jni/Native.cxx (Native::throwElements): New.
+	* cni/Native.cxx (Native::throwElements): New.
+	* jni/Native.cxx (Native::throwElements): New.
+
 2008-05-20  Andrew Cagney  <cagney@redhat.com>
 
 	* JniBindings.java: Generate attributes such as no-return.
diff --git a/frysk-sys/jnixx/Native.java b/frysk-sys/jnixx/Native.java
index 82d857c..9cbdd54 100644
--- a/frysk-sys/jnixx/Native.java
+++ b/frysk-sys/jnixx/Native.java
@@ -58,4 +58,7 @@ abstract class Native {
     static native void throwRuntimeException();
 
     static native boolean catchRuntimeException(Native e);
+
+    static native void throwElements(String string, String[] stringArray,
+				     byte[] bytes);
 }
diff --git a/frysk-sys/jnixx/TestJnixx.java b/frysk-sys/jnixx/TestJnixx.java
index d2c9465..b99b02f 100644
--- a/frysk-sys/jnixx/TestJnixx.java
+++ b/frysk-sys/jnixx/TestJnixx.java
@@ -85,4 +85,17 @@ public class TestJnixx extends TestCase {
 		}
 	    }));
     }
+
+    public void testElementsRelease() {
+	boolean thrown = false;
+	try {
+	    Native.throwElements("a string", new String[] {
+		    "a", "string", "array",
+		},
+		new byte[] { 1, 2, 3, 4, 5, 6 });
+	} catch (RuntimeException e) {
+	    thrown = true;
+	}
+	assertTrue("thrown", thrown);
+    }
 }
diff --git a/frysk-sys/jnixx/cni/Native.cxx b/frysk-sys/jnixx/cni/Native.cxx
index 26ced9f..7e83df1 100644
--- a/frysk-sys/jnixx/cni/Native.cxx
+++ b/frysk-sys/jnixx/cni/Native.cxx
@@ -86,3 +86,10 @@ jnixx::Native::catchRuntimeException(jnixx::Native* e) {
     return true;
   }
 }
+
+void
+jnixx::Native::throwElements(jstring string,
+			     jstringArray stringArray,
+			     jbyteArray bytes) {
+  throw new java::lang::RuntimeException(JvNewStringUTF("oops!"));
+}
diff --git a/frysk-sys/jnixx/elements.cxx b/frysk-sys/jnixx/elements.cxx
index 65b3315..dd15213 100644
--- a/frysk-sys/jnixx/elements.cxx
+++ b/frysk-sys/jnixx/elements.cxx
@@ -45,6 +45,7 @@
 #include <stdio.h>
 #include <unistd.h>
 #include <stdlib.h>
+#include <string.h>
 
 #include "jni.hxx"
 
@@ -102,7 +103,47 @@ chars2strings(::jnixx::env env, char** argv) {
 }
 
 void
-slurp(jnixx::env env, FileBytes& bytes, const char* file) {
+FileBytes::operator=(const FileBytes& src) {
+  release();
+  ::strcpy(this->file, src.file);
+  this->env = src.env;
+  // Don't copy the pointer.
+}
+
+FileBytes::FileBytes(jnixx::env env, const char* fmt, ...) {
+  va_list ap;
+  va_start(ap, fmt);
+  if (::vsnprintf(file, sizeof file, fmt, ap)
+      >= (int) sizeof file) {
+    errnoException(env, errno, "vsnprintf");
+  }
+  va_end(ap);
+  this->env = env;
+}
+
+FileBytes::FileBytes(jnixx::env env, int pid, const char* name) {
+  // Convert the string into a file.
+  if (::snprintf(file, sizeof file, "/proc/%d/%s", pid, name)
+      >= (int) sizeof file) {
+    errnoException(env, errno, "snprintf");
+  }
+  this->env = env;
+}
+
+FileBytes::FileBytes(jnixx::env env, int pid, int tid, const char* name) {
+  // Convert the string into a file.
+  if (::snprintf(file, sizeof file, "/proc/%d/task/%d/%s", pid, tid, name)
+      >= (int) sizeof file) {
+    errnoException(env, errno, "snprintf");
+  }
+  this->env = env;
+}
+
+jsize
+FileBytes::length() {
+  if (l >= 0)
+    return l;
+
   // Attempt to open the file.
   int fd = ::open(file, O_RDONLY);
   if (fd < 0) {
@@ -116,85 +157,63 @@ slurp(jnixx::env env, FileBytes& bytes, const char* file) {
   // reads are needed to confirm EOF.  Allocating 2&BUFSIZE ensures
   // that there's always space for at least two reads.  Ref SW #3370
   jsize allocated = BUFSIZ * 2 + 1;
-  bytes.elements = (jbyte*) ::malloc(allocated);
-  if (bytes.elements == NULL) {
+  p = (jbyte*) ::malloc(allocated);
+  if (p == NULL) {
     errnoException(env, errno, "malloc");
   }
 
-  bytes.length = 0;
+  l = 0;
   while (true) {
     // Attempt to fill the remaining buffer; less space for a
     // terminating NUL character.
-    int size = ::read(fd, bytes.elements + bytes.length,
-		      allocated - bytes.length - 1);
+    int size = ::read(fd, p + l, allocated - l - 1);
     if (size < 0) {
       ::close(fd);
-      bytes.release();
+      release();
       // Abandon the read with elements == NULL.
-      return;
+      p = NULL;
+      l = 0;
+      return 0;
     } else if (size == 0) {
       break;
     }
-    bytes.length += size;
+    l += size;
 
-    if (bytes.length + BUFSIZ >= allocated) {
+    if (l + BUFSIZ >= allocated) {
       // Not enough space for the next ~BUFSIZ'd read; expand the
       // buffer.  Don't trust realloc with the pointer; will need to
       // free the old buffer if something goes wrong.
       allocated += BUFSIZ;
-      jbyte *tmp = (jbyte*)::realloc(bytes.elements, allocated);
+      jbyte *tmp = (jbyte*)::realloc(p, allocated);
       if (tmp == NULL) {
 	int err = errno;
 	::close(fd);
-	bytes.release();
+	release();
 	errnoException(env, err, "realloc");
       }
-      bytes.elements = tmp;
+      p = tmp;
     }
   }
 
   ::close(fd);
 
   // Null terminate the buffer.
-  bytes.elements[bytes.length] = '\0';
-  bytes.length++; // count the trailing NUL
-}
-
-FileBytes::FileBytes(jnixx::env env, const char* fmt, ...) {
-  // Convert the string into a file.
-  char file[FILENAME_MAX];
-  va_list ap;
-  va_start(ap, fmt);
-  if (::vsnprintf(file, sizeof file, fmt, ap) >= FILENAME_MAX) {
-    errnoException(env, errno, "vsnprintf");
-  }
-  va_end(ap);
-  slurp(env, *this, file);
+  p[l] = '\0';
+  l++; // count the trailing NUL
+  return l;
 }
 
-FileBytes::FileBytes(jnixx::env env, int pid, const char* name) {
-  // Convert the string into a file.
-  char file[FILENAME_MAX];
-  if (::snprintf(file, sizeof file, "/proc/%d/%s", pid, name) >= FILENAME_MAX) {
-    errnoException(env, errno, "snprintf");
-  }


hooks/post-receive
--
frysk system monitor/debugger


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-05-21 18:12 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-05-21 18:12 [SCM] master: Overload = and copy in element classes; prevents copy leading to double free cagney

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).