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

Commit 4b1a3cb8 authored by Unpublished's avatar Unpublished
Browse files

Fix leaking pfds



Signed-off-by: default avatarUnpublished <unpublished@gmx.net>
parent 7fdd80d4
Loading
Loading
Loading
Loading
+50 −50
Original line number Diff line number Diff line
@@ -11,13 +11,10 @@ import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.util.Log;

import androidx.annotation.NonNull;

import com.google.gson.Gson;
import com.google.gson.internal.LinkedTreeMap;
import com.nextcloud.android.sso.Constants;
import com.nextcloud.android.sso.aidl.IInputStreamService;
import com.nextcloud.android.sso.aidl.IThreadListener;
import com.nextcloud.android.sso.aidl.NextcloudRequest;
import com.nextcloud.android.sso.aidl.ParcelFileDescriptorUtil;
import com.nextcloud.android.sso.exceptions.NextcloudApiNotRespondingException;
@@ -33,6 +30,8 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicBoolean;

import androidx.annotation.NonNull;

import static com.nextcloud.android.sso.exceptions.SSOException.parseNextcloudCustomException;

public class AidlNetworkRequest extends NetworkRequest {
@@ -164,6 +163,7 @@ public class AidlNetworkRequest extends NetworkRequest {
    public Response performNetworkRequestV2(NextcloudRequest request, InputStream requestBodyInputStream) throws Exception {
        ParcelFileDescriptor output = performAidlNetworkRequestV2(request, requestBodyInputStream);
        InputStream os = new ParcelFileDescriptor.AutoCloseInputStream(output);
        try {
            ExceptionResponse response = deserializeObjectV2(os);

            // Handle Remote Exceptions
@@ -173,7 +173,13 @@ public class AidlNetworkRequest extends NetworkRequest {
                }
                throw response.getException();
            }
            // os stream needs to stay open to be able to read response
            return new Response(os, response.headers);
        } catch (Exception e) {
            // close os stream if something goes wrong and no response will be created
            os.close();
            throw e;
        }
    }

    /**
@@ -198,11 +204,15 @@ public class AidlNetworkRequest extends NetworkRequest {

        // Handle Remote Exceptions
        if (exception != null) {
            // close os stream if something goes wrong and no response will be created
            os.close();
            if (exception.getMessage() != null) {
                exception = parseNextcloudCustomException(exception);
            }
            throw exception;
        }

        // os stream needs to stay open to be able to read response
        return os;
    }

@@ -239,8 +249,8 @@ public class AidlNetworkRequest extends NetworkRequest {
        baos.close();
        InputStream is = new ByteArrayInputStream(baos.toByteArray());

        ParcelFileDescriptor input = ParcelFileDescriptorUtil.pipeFrom(is,
                thread -> Log.d(TAG, "copy data from service finished"));
        try (ParcelFileDescriptor input = ParcelFileDescriptorUtil.pipeFrom(is,
                thread -> Log.d(TAG, "copy data from service finished"))) {

            ParcelFileDescriptor requestBodyParcelFileDescriptor = null;
            if (requestBodyInputStream != null) {
@@ -254,9 +264,9 @@ public class AidlNetworkRequest extends NetworkRequest {
            } else {
                output = mService.performNextcloudRequest(input);
            }

            return output;
        }
    }

    /**
     * DO NOT CALL THIS METHOD DIRECTLY - use @link(performNetworkRequestV2) instead
@@ -288,23 +298,13 @@ public class AidlNetworkRequest extends NetworkRequest {
        baos.close();
        InputStream is = new ByteArrayInputStream(baos.toByteArray());

        ParcelFileDescriptor input = ParcelFileDescriptorUtil.pipeFrom(is,
                new IThreadListener() {
                    @Override
                    public void onThreadFinished(Thread thread) {
                        Log.d(TAG, "copy data from service finished");
                    }
                });
        try (ParcelFileDescriptor input = ParcelFileDescriptorUtil.pipeFrom(is,
                thread -> Log.d(TAG, "copy data from service finished"))) {

            ParcelFileDescriptor requestBodyParcelFileDescriptor = null;
            if (requestBodyInputStream != null) {
                requestBodyParcelFileDescriptor = ParcelFileDescriptorUtil.pipeFrom(requestBodyInputStream,
                    new IThreadListener() {
                        @Override
                        public void onThreadFinished(Thread thread) {
                            Log.d(TAG, "copy data from service finished");
                        }
                    });
                        thread -> Log.d(TAG, "copy data from service finished"));
            }

            ParcelFileDescriptor output;
@@ -313,9 +313,9 @@ public class AidlNetworkRequest extends NetworkRequest {
            } else {
                output = mService.performNextcloudRequestV2(input);
            }

            return output;
        }
    }

    private static <T> T deserializeObject(InputStream is) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(is);