Classes that implement the Externalizable
interface must provide the readExternal()
and writeExternal()
methods. These methods have package access or are public access, and so they can be called by trusted and hostile untrusted code alike. Consequently, programs must ensure that these methods execute only when intended, and that they cannot overwrite the internal state of objects at arbitrary points during program execution.
...
This noncompliant code example allows any caller to reset the value of the object at any time, because the readExternal()
method is necessarily declared to be public and lacks protection against hostile callers.
...
This compliant solution protects against multiple initialization through the use of a boolean flag that is set after the instance fields have been populated. It also protects against race-conditions by synchronizing on a private lock object (see LCK00-J. Use private final lock objects to synchronize classes that may interact with untrusted code). It also protects against multiple initialization through the use of a boolean flag that is set after the instance fields have been populated.
Code Block | ||
---|---|---|
| ||
private final Object lock = new Object(); private boolean initialized = false; public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { synchronized (lock) { if (!initialized) { // Read instance fields this.name = (String)in.readObject(); this.UID = in.readInt(); //... initialized = true; } else { throw new IllegalStateException(); } } } |
...
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="1f6b0dd656295395-d9cd99d0-4b704f4f-91bdbf1c-ad76e5a486a6f8bb5b4f8eca"><ac:plain-text-body><![CDATA[ | [[API 2006 | AA. Bibliography#API 06]] |
| ]]></ac:plain-text-body></ac:structured-macro> |
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="1e5588e04f1fef96-86912130-4d8f486c-bc61b867-4fa1df2a1807d78bac12260b"><ac:plain-text-body><![CDATA[ | [[Sun 2006 | AA. Bibliography#Sun 06]] | "Serialization specification: A.7 Preventing Overwriting of Externalizable Objects" | ]]></ac:plain-text-body></ac:structured-macro> |
...