Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8cd48574 authored by Gilles Debunne's avatar Gilles Debunne
Browse files

Fixed bug in BitmapFactory.decodeStream

Downloading images over a slow connection could result in errors and
null images.

The JavaInputStreamAdaptor::do_skip method was correctly called in a
loop (to handle the EOF case using read()), but the amount that was
skipped at each time was not decreased by the amount already skipped.

Bug http://code.google.com/p/android/issues/detail?id=6066

Cherry picked from master CL57808

Change-Id: Ie6856898b21ba31de1209e1f995b4ae784c919b9
parent 021697ad
Loading
Loading
Loading
Loading
+5 −3
Original line number Original line Diff line number Diff line
@@ -52,7 +52,7 @@ public:
                return 0;
                return 0;
            }
            }
            
            
            if (n <= 0) {
            if (n < 0) { // n == 0 should not be possible, see InputStream read() specifications.
                break;  // eof
                break;  // eof
            }
            }
            
            
@@ -76,17 +76,19 @@ public:
    
    
    size_t doSkip(size_t size) {
    size_t doSkip(size_t size) {
        JNIEnv* env = fEnv;
        JNIEnv* env = fEnv;

        jlong skipped = env->CallLongMethod(fJavaInputStream,
        jlong skipped = env->CallLongMethod(fJavaInputStream,
                                            gInputStream_skipMethodID, (jlong)size);
                                            gInputStream_skipMethodID, (jlong)size);
        if (env->ExceptionCheck()) {
        if (env->ExceptionCheck()) {
            env->ExceptionDescribe();
            env->ExceptionDescribe();
            env->ExceptionClear();
            env->ExceptionClear();
            SkDebugf("------- available threw an exception\n");
            SkDebugf("------- skip threw an exception\n");
            return 0;
            return 0;
        }
        }
        if (skipped < 0) {
        if (skipped < 0) {
            skipped = 0;
            skipped = 0;
        }
        }

        return (size_t)skipped;
        return (size_t)skipped;
    }
    }
    
    
@@ -115,7 +117,7 @@ public:
                 */
                 */
                size_t amountSkipped = 0;
                size_t amountSkipped = 0;
                do {
                do {
                    size_t amount = this->doSkip(size);
                    size_t amount = this->doSkip(size - amountSkipped);
                    if (0 == amount) {
                    if (0 == amount) {
                        char tmp;
                        char tmp;
                        amount = this->doRead(&tmp, 1);
                        amount = this->doRead(&tmp, 1);