[libvirt] [PATCH] [libvirt-java] Fix Array IndexOutOfBoundsException for unknown error codes

Eric Blake eblake at redhat.com
Wed Aug 1 22:57:33 UTC 2012


On 08/01/2012 08:11 AM, Claudio Bley wrote:
> At Mon, 23 Jul 2012 14:56:55 -0600,

>> the old version crashed, and your version leaves code as null (which is
>> a strict improvement, but might cause its own NullPointer issue later
>> on).  Having an else branch that sticks in a placeholder would be nicer
>> to end clients to at least recognize that they are talking to a newer
>> server, without crashing.
> 
> Please have look at the following patch.
> 
> -- >8 --
> Subject: [PATCH] Fix IndexOutOfBoundsException for unknown error
>  number/domain/level codes.
> 
> Remove default constructor because it does not init the object properly.
> 
> Add a special *_UNKNOWN enum value to each enum which is used when the
> given enum code is out of bounds.

> +    /**
> +     * Map an integer to an enum value.
> +     *
> +     * @return when {@code n < values.length} return n-th item of
> +     *          {@code values}, otherwise the last item of array
> +     *          {@code values}.
> +     */
> +    private static final <T extends Enum<T>> T wrapToEnum(final int n, final T[] values) {

Wow, Java has changed since I last programmed in it (I haven't
programmed Java since 1.4 when 'assert' was added, although I was at
least following the development of Java 1.5 at the time enough to
understand this syntax - I guess that would be 8 or so years ago?).

> @@ -71,7 +90,13 @@ public class Error implements Serializable {
>          /**
>           * An error
>           */
> -        VIR_ERR_ERROR
> +        VIR_ERR_ERROR,
> +
> +        VIR_ERR_UNKNOWN; /* must be the last entry! */

Is this...

> +
> +        protected static final ErrorLevel wrap(int value) {
> +            return wrapToEnum(value, values());
> +        }
>      }
>  
>      public static enum ErrorNumber {
> @@ -161,6 +186,11 @@ public class Error implements Serializable {
>          VIR_ERR_MIGRATE_UNSAFE, /* Migration is not safe */
>          VIR_ERR_OVERFLOW, /* integer overflow */
>          VIR_ERR_BLOCK_COPY_ACTIVE, /* action prevented by block copy job */
> +        VIR_ERR_UNKNOWN; /* unknown error (must be the last entry!) */

...and this common use of a name among two different enums going to bite
us?  If so, I'd recommend munging the names, maybe:
VIR_ERR_LEVEL_UNKNOWN vs. VIR_ERR_NUMBER_UNKNOWN.

>      public Error(virError vError) {
> -        code = ErrorNumber.values()[vError.code];
> -        domain = ErrorDomain.values()[vError.domain];
> -        level = ErrorLevel.values()[vError.level];
> +        code = code.wrap(vError.code);
> +        domain = domain.wrap(vError.domain);
> +        level = level.wrap(vError.level);

Slick.  Depending on your answer to my question on whether a rename
makes sense, I don't mind pushing this or a slightly different v2.  When
using 'git send-email', it helps to use '--subject-prefix="libvirt-java
PATCHv2" ' for the repost to make it obvious that it is a revision of an
earlier post.

-- 
Eric Blake   eblake at redhat.com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 620 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20120801/b8a727af/attachment-0001.sig>


More information about the libvir-list mailing list